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;
}



 

posted @ 2016-11-16 13:43  2000xyy  阅读(89)  评论(0编辑  收藏  举报