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 }

你可能感兴趣的:(poj)