SPFA算法求最短路径(解决负边权问题)

SPFA算法是对bellman-fort算法的进一步优化,更大程度的减小时间复杂度;

具体看代码

#include
#include
#include
#define info 99999
#define maxn 100


using namespace std;




int dis[maxn];
int v,e;//点,边
queue q;
int flag[maxn];//表示所有的点都不在队列中
int times[maxn];//表示每一个点的入队次数
//边集
struct graph
{
	int s,e,w;
}es[maxn];
bool spfa(int s)
{
	int i;
	for(i=1;i<=v;i++)
	{
		dis[i]=info;
		flag[i]=0;
		times[i]=0;
	}
	dis[s]=0;
	q.push(s);
	times[s]++;
	while(!q.empty())
	{
		int t = q.front();
		q.pop();
		flag[t]=0;
		for(i=1;i<=e;i++)
		{
			if(dis[es[i].e]>dis[es[i].s]+es[i].w)
			{
				dis[es[i].e]=dis[es[i].s]+es[i].w;
				if(flag[es[i].e]==0)
				{
					q.push(es[i].e);
					flag[es[i].e]=1;
					times[es[i].e]++;
					if(times[es[i].e]==v)
						return false;//存在负环
				}
			}
		}
	}
	return true;


}


int main()
{
    scanf("%d%d",&v,&e);
    for(int i=0;i


你可能感兴趣的:(最短路径,C++)