POJ1797 Heavy Transportation(SPFA)

题目要求1到n点的最大容量的增广路。

听说是最短路求的,然后乱搞就A了。。

大概能从Bellman-Ford的思想,dk[u]表示从源点出发经过最多k条边到达u点的最短路,上理解正确性。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 #define INF (1<<30)
 7 #define MAXN 1111
 8 #define MAXM 1000111
 9 
10 struct Edge{
11     int v,cost,next;
12 }edge[MAXM];
13 int head[MAXN],NE;
14 void addEdge(int a,int b,int c){
15     edge[NE].v=b; edge[NE].cost=c; edge[NE].next=head[a];
16     head[a]=NE++;
17 }
18 
19 int d[MAXN];
20 int n,m;
21 void SPFA(){
22     bool vis[MAXN]={1,1};
23     for(int i=1; i<=n; ++i) d[i]=0;
24     d[1]=INF;
25     queue<int> que;
26     que.push(1);
27     while(!que.empty()){
28         int u=que.front(); que.pop();
29         for(int i=head[u]; i!=-1; i=edge[i].next){
30             int v=edge[i].v;
31             if(d[v]<min(d[u],edge[i].cost)){
32                 d[v]=min(d[u],edge[i].cost);
33                 if(!vis[v]){
34                     vis[v]=1;
35                     que.push(v);
36                 }
37             }
38         }
39         vis[u]=0;
40     }
41 }
42 int main(){
43     int t,a,b,c;
44     scanf("%d",&t);
45     for(int cse=1; cse<=t; ++cse){
46         scanf("%d%d",&n,&m);
47         NE=0;
48         memset(head,-1,sizeof(head));
49         while(m--){
50             scanf("%d%d%d",&a,&b,&c);
51             addEdge(a,b,c);
52             addEdge(b,a,c);
53         }
54         SPFA();
55         printf("Scenario #%d:\n",cse);
56         printf("%d\n\n",d[n]);
57     }
58     return 0;
59 }

 

转载于:https://www.cnblogs.com/WABoss/p/5093939.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值