A Za, A Za, Fighting...

坚信:勤能补拙

PKU 1724 ROADS

问题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1724

思路:
有点与PKU 3256类似的题
第一个想法就是深搜
第一遍代码(WA):
对于discuss里的测试数据该代码是没有问题的,可结果还是WA...
 1 #define MAX_CITIES 101
 2 #define INF 100000
 3 int road[MAX_CITIES][MAX_CITIES];
 4 int length[MAX_CITIES][MAX_CITIES];
 5 int toll[MAX_CITIES][MAX_CITIES];
 6 int visited[MAX_CITIES];
 7 int k, n, r; 
 8 int min_len;
 9 
10 void
11 dfs(int city, int cur_len, int cur_toll)
12 {
14     int i;
15     visited[city] = 1;
16     if(cur_len>=min_len || cur_toll>k) {
17         visited[city] = 0;
18         return;
19     }
20     if(city == n) {
21         min_len = cur_len;
22         visited[city] = 0;
23         return;
24     }
25     for(i=1; i<=n; i++) {
26         if(road[city][i] && !visited[i]) 
27             dfs(i, cur_len+length[city][i], cur_toll+toll[city][i]);
28     }
29     visited[city] = 0;
30 }

继续翻查discuss里,发现有人说两点之间可能有多条路径...
然后看到其他人代码是使用链表来保存所有的路径,所以修改后的AC代码如下:

 1 #define MAX_CITIES 101
 2 #define INF 100000
 3 struct Node {
 4     int dest;
 5     int len;
 6     int toll;
 7     struct Node *next;
 8 };
 9 struct Node roads[MAX_CITIES];
10 struct Node backup[MAX_CITIES*MAX_CITIES];
11 int visited[MAX_CITIES];
12 int k, n, r; 
13 int min_len;
14 
15 void
16 dfs(int c, int cur_len, int cur_toll)
17 {
18     int i;
19     struct Node *node;
20     if(cur_len>=min_len || cur_toll>k) 
21         return;
22     if(c == n) {
23         min_len = cur_len;
24         return;
25     }
26     for(node=roads[c].next; node!=NULL; node=node->next) {
27         if(!visited[node->dest]) {
28             visited[node->dest] = 1;
29             dfs(node->dest, cur_len+node->len, cur_toll+node->toll);
30             visited[node->dest] = 0;
31         }
32     }
33 }
34 
35 int
36 main(int argc, char **argv)
37 {
38     int i, s, d, l, t, cnt=0;
39     memset(visited, 0sizeof(visited));
40     scanf("%d"&k);
41     scanf("%d"&n);
42     scanf("%d"&r);
43     for(i=1; i<=n; i++)
44         roads[i].next = NULL;
45     for(i=0; i<r; i++) {
46         scanf("%d %d %d %d"&s, &d, &l, &t);
47         backup[cnt].dest = d;
48         backup[cnt].len = l;
49         backup[cnt].toll = t;
50         backup[cnt].next = roads[s].next;
51         roads[s].next = backup+cnt;
52         ++cnt;
53     }
54     min_len = INF;
55     visited[1= 1;
56     dfs(100);
57     if(min_len == INF)
58         printf("-1\n");
59     else
60         printf("%d\n", min_len);
61 }


posted on 2010-08-02 15:10 simplyzhao 阅读(184) 评论(0)  编辑 收藏 引用 所属分类: B_搜索


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜