![复制代码](//assets.cnblogs.com/images/copycode.gif)
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 }
![复制代码](//assets.cnblogs.com/images/copycode.gif)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步