poj 1724 ROADS

 1  1 
 2 http://poj.org/problem?id=1724
 3 一开始就直接写了一个DFS,直接TLE,以为用dfs肯定会超,后来看到discuss里有人
 4  2 有人用了DFS,所以看了 看,发现进行一些优化,后就可以AC
 5  3 优化看代码
 6  4      
 7  5 #include<stdio.h>
 8  6 #include<string.h>
 9  7 #define maxn 20000
10  8 #define max 0x7fffffff
11  9 
12 10 struct node
13 11 {
14 12     int d;
15 13     int l;
16 14     int t;
17 15     int next;
18 16 }p[maxn*2];
19 17 int num,k,n,r,vis[maxn*2],next[maxn],ans;
20 18 
21 19 void add(int s,int d,int l,int t)
22 20 {
23 21     p[num].d=d;
24 22     p[num].l=l;
25 23     p[num].t=t;
26 24     p[num].next=next[s];
27 25     next[s]=num++;
28 26 
29 27 
30 28 }
31 29 void  DFS(int x,int d,int sum)
32 30 {
33 31 
34 32     if(sum>k)return ;
35 33     if(x==n)
36 34     {
37 35 
38 36         if(ans>d)ans=d;
39 37         return ;
40 38     }
41 39     for(int i=next[x];i!=-1;i=p[i].next)
42 40     {
43 41         int v=p[i].d;
44 42         if(!vis[v]&&d+p[i].l<ans&&sum+p[i].t<=k)//在这优化判断条件加了d+p[i].l<ans&&sum+p[i].t<=k
45 43         {                                       //没有将他们提到上面,提到上面就TLE
46 44             vis[v]=1;
47 45             DFS(v,d+p[i].l,sum+p[i].t);
48 46             vis[v]=0;
49 47 
50 48         }
51 49     }
52 50 }
53 51 
54 52 int main()
55 53 {
56 54     int i,s,d,l,t;
57 55     while(scanf("%d%d%d",&k,&n,&r)!=EOF)
58 56     {
59 57 
60 58         num=0;
61 59         memset(next,-1,sizeof(next));
62 60         for(i=0;i<r;i++)
63 61         {
64 62             scanf("%d%d%d%d",&s,&d,&l,&t);
65 63             add(s,d,l,t);
66 64         }
67 65         memset(vis,0,sizeof(vis));
68 66         ans=max;
69 67 
70 68         DFS(1,0,0);
71 69         if(ans!=max)printf("%d\n",ans);
72 70         else printf("-1\n");
73 71 
74 72     }
75 73 
76 74 }
posted @ 2012-07-17 15:12  Szz  阅读(158)  评论(0编辑  收藏  举报