#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队列优化(邻接表)
原文作者:Bellman - ford算法
原文地址: https://blog.csdn.net/wzw1376124061/article/details/52557470
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/wzw1376124061/article/details/52557470
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。