spfa模板

Posted wls001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spfa模板相关的知识,希望对你有一定的参考价值。

 1 #include<iostream>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<queue>
 7 #define inf 2147483647
 8 using namespace std;
 9 struct data
10 {
11     int from,to,next,w;
12     data(){from=-1,to=-1,next=-1,w=-1;}
13 }e[2000];
14 int n,m;
15 int head[2000];
16 int d[2000],p[2000],sum[2000];
17 bool vis[2000];
18 int cnt=0;
19 void add(int u,int v,int w){e[cnt].from=u,e[cnt].to=v;e[cnt].next=head[u],head[u]=cnt,e[cnt].w=w,cnt++;}
20 bool spfa(int s)
21 {
22     queue<int> q;
23     for(int i=1;i<=n;i++) d[i]=inf;
24     q.push(s);
25     d[s]=0;
26     memset(vis,0,sizeof(vis));
27     vis[s]=1;
28     while(!q.empty())
29     {
30         int x=q.front();
31         q.pop();
32         vis[x]=0;
33         for(int i=head[x];i>=0;i=e[i].next)
34         {
35             if(d[e[i].from]<inf&&d[e[i].to]>d[e[i].from]+e[i].w)
36             {
37                 d[e[i].to]=d[e[i].from]+e[i].w;
38                 p[e[i].to]=i;
39                 if(!vis[e[i].to]){q.push(e[i].to);vis[e[i].to]=1;if(++sum[e[i].to]>n) return false;}
40             }
41         }
42     }
43     return true;
44 }
45 int main()
46 {
47     memset(head,-1,sizeof(head));
48     scanf("%d%d",&n,&m);
49     for(int i=1;i<=m;i++)
50     {
51         int u,v,w;
52         scanf("%d%d%d",&u,&v,&w);
53         add(u,v,w);
54         add(v,u,w);
55     }
56     int s,t;
57     scanf("%d%d",&s,&t);
58     spfa(s);
59     cout<<d[t];
60 }
View Code

 

以上是关于spfa模板的主要内容,如果未能解决你的问题,请参考以下文章

SPFA算法以及负环判断模板

SPFA算法以及负环判断模板

模板SPFA(不完全详解)

Minimum Cost POJ - 2516 (模板题 spfa最小费用最大流)

spfa(模板)

VSCode自定义代码片段——.vue文件的模板