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 }