poj1724ROADS(BFS)

链接

本来想写spfa 加点什么限制什么的可能就过了 写着写着就成裸BFS了 也没优化就水过了

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<queue>
 7 using namespace std;
 8 #define N 110
 9 #define M 10010
10 #define INF 0xfffffff
11 struct node
12 {
13     int u,v,w,next,len;
14 }ed[M<<1];
15 struct mode
16 {
17     int u,sum,len;
18 };
19 int head[N],vis[N],dis[N];
20 int n,m,t,sp,ans;
21 void init()
22 {
23     t = 0;
24     memset(head,-1,sizeof(head));
25 }
26 void add(int u,int v,int w,int len)
27 {
28     ed[t].u = u;
29     ed[t].v = v;
30     ed[t].w = w;
31     ed[t].len = len;
32     ed[t].next = head[u];
33     head[u] = t++;
34 }
35 void spfa()
36 {
37     queue<mode>q;
38     mode ss,st;
39     int i;
40     for(i = 2; i <= n ; i++)
41     dis[i] = INF;
42     ss.u = 1;
43     ss.sum = 0;
44     ss.len = 0;
45     q.push(ss);
46     dis[1] = 0;
47     while(!q.empty())
48     {
49         ss = q.front();
50         q.pop();
51         int u = ss.u;
52         if(ss.len>ans)
53         continue;
54         if(u==n)
55         {
56             ans = ss.len;
57             continue;
58         }
59         for(i = head[u] ; i!=-1 ; i = ed[i].next)
60         {
61             int v = ed[i].v;
62             if(ss.sum+ed[i].w<=sp)
63             {
64                 st.len = ss.len+ed[i].len;
65                 st.u = v;
66                 st.sum = ss.sum+ed[i].w;
67                 q.push(st);
68             }
69         }
70     }
71     if(ans!=INF)
72     printf("%d
",ans);
73     else
74     printf("-1
");
75 }
76 int main()
77 {
78     int i,u,v,len,w;
79     while(scanf("%d",&sp)!=EOF)
80     {
81         init();
82         ans = INF;
83         scanf("%d%d",&n,&m);
84         for(i = 1; i <= m ;i++)
85         {
86             scanf("%d%d%d%d",&u,&v,&len,&w);
87             add(u,v,w,len);
88         }
89         spfa();
90     }
91     return 0;
92 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3298531.html