Bellman-Ford队列优化(邻接表)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define inf 999999999 
#define MAX 10000
using namespace std;
int u[MAX],v[MAX],w[MAX];
int first[MAX],next[MAX];
int dist[MAX],vis[MAX];
int que[MAX],head=1,tail=1;//手打队列que 
int main(){
	int k,m,n;
	scanf("%d%d",&n,&m);//n个点,m条边
	for(int i=1;i<=n;i++)
		dist[i]=inf;
	dist[1]=0;
	for(int i=1;i<=n;i++)
		vis[i]=0;
	//初始化first数组下标1~n的值为-1,表示1~n顶点暂时都没有边 
	for(int i=1;i<=n;i++) 
		first[i]=-1;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&u[i],&v[i],&w[i]);
		//建立邻接表关键
		next[i]=first[u[i]];
		first[u[i]]=i;
	}
	que[tail]=1;//入队
	tail++;
	vis[1]=1;
	while(head<tail){//队列不为空 
		k=first[que[head]];
		while(k!=-1){
			if(dist[v[k]]>dist[u[k]]+w[k]){
				dist[v[k]]=dist[u[k]]+w[k];
				if(vis[v[k]]==0){
					//入队 
					que[tail]=v[k];
					tail++;
					vis[v[k]]=1;
				}
			}
			k=next[k];
		}
		//出队 
		vis[que[head]]=0;
		head++;
	}
	for(int i=1;i<=n;i++)
		printf("%d ",dist[i]);
	return 0;
}
//测试数据如下 
/*
5 5
2 3 2
1 2 -3
1 5 5
4 5 2
3 4 3

0 -3 -1 2 4
*/
/*
5 7
1 2 2
1 5 10
2 3 3
2 5 7
3 4 4
4 5 5
5 3 6

0 2 5 9 9
*/

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/wzw1376124061/article/details/52557470
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞