spfa模板
通过stl的queue实现的spfa(vector实现邻接表存图)
本模板没有考虑存在两点不连通的情况
如果需要判断则需要用到并查集或者遍历整个邻接表
#include<iostream> #include<queue> #include<cstdio> #include<cstring> #include<vector> using namespace std; int d[10001];//存储起始点到点的最短距离 int v[10001];//标记是否已经入队 int c[10001];//记录入队次数 int n,m,s; int x,y,z; struct edge { int to,w; }; queue<int> q; vector<edge> map[10001]; int spfa(int u) { memset(d,0x7f,sizeof(d));//初始化 q.push(u);//将点加入队列 v[u]=0; d[s]=0;//起始点的距离为0 while(!q.empty())//队列不为空时 { int x; x=q.front();//取出队首点 q.pop(); v[x]=0;//已经不在队列中 for (vector<edge> ::iterator k=map[x].begin();k!=map[x].end();k++) {//遍历每一个与其连接的点 edge o=*k; int y=o.to; if (d[x]+o.w<d[y])//图的松弛 { d[y]=d[x]+o.w; if (!v[y])//如果此点没入队 { v[y]=1;//将其入队 c[y]++;//入队次数++ q.push(y); if (c[y]>n) return 0;//如果入队次数超过点数则存在环 } } } } return 1; } int main () { edge e; cin>>n>>m>>s; for (int i=1;i<=m;i++) { cin>>x>>y>>z; e.to=y; e.w=z; map[x].push_back(e); } spfa(s); for (int i=1;i<=n;i++) { cout<<d[i]<<' '; } return 0; }