//有负权的图的最短路
//如果存在最短路就一定存在一条不含圈的最短路,最短路最多经过n-1个节点,通过松弛n-1轮得到
//BellmanFord 算法包含了Dijkstra算法
//基于邻接矩阵的Bellman-Ford算法
//基于FIFO队列的Bellman-Ford算法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=10000;
int f[maxn],t[maxn],w[maxn],d[maxn];
int n,m,bg,ed;
void BellmanFord(){
for(int i=0;i<n;i++)
i==bg?d[i]=0:d[i]=0x3f3f3f3f;
for(int i=0;i<n-1;i++){
for(int j=0;j<m;j++){
int x=f[i],y=t[i];
if(d[x]<0x3f3f3f3f)
if(d[y]>d[x]+w[i])
d[y]=d[x]+w[i];
}
}
}
int main(){
cout<<“n m bg ed”<<endl;
cin>>n>>m>>bg>>ed;
cout<<“Edge”<<endl;
for(int i=0;i<m;i++){
cin>>f[i]>>t[i]>>w[i];
}
BellmanFord();
for(int i=0;i<n;i++)printf(“%d “,d[i]);
return 0;
}
//发现负圈时退出
#include<iostream>
#include<vector>
#include<cstdio>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=10000;
struct Edge{
int f,e,l;
};
vector<Edge> edge;
int d[maxn],v[maxn],cnt[maxn];
vector<int> G[maxn];
int n,m,bg,ed;
int BellmanFord(){
for(int i=0;i<n;i++)
i==bg?d[i]=0:d[i]=0x3f3f3f3f;
memset(cnt,0,sizeof(cnt));
memset(v,0,sizeof(v));
queue<int> que;
v[bg]=1;
que.push(bg);
while(que.size()){
int u=que.front();que.pop();
v[u]=0;
for(int i=0;i<G[u].size();i++){
Edge& e=edge[G[u][i]];
if(d[u]<0x3f3f3f3f&&d[e.e]>d[u]+e.l){
d[e.e]=d[u]+e.l;
if(!v[e.e]){
que.push(e.e);
v[e.e]=1;
if(++cnt[e.e]>n)return 0;
}
}
}
}
return 1;
}
int main(){
cout<<“n m bg ed”<<endl;
cin>>n>>m>>bg>>ed;
cout<<“The edges”<<endl;
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
edge.push_back(Edge{a,b,c});
G[a].push_back(edge.size()-1);
}
BellmanFord();
for(int i=0;i<n;i++)printf(“%d “,d[i]);
return 0;
}