#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#include <set>
#include <ctype.h>//isalpha,isdight,toupper
#include <map>
#include <sstream>
typedef long long ll;
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=25;
int main(){
int dis[10],i,k,n,m,u[10],v[10],w[10];
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d%d%d",&u[i],&v[i],&w[i]);
}
for(i=1;i<=n;i++){
dis[i]=inf;
}
dis[1]=0;
for(k=1;k<=n-1;k++){
for(i=1;i<=m;i++){
if(dis[v[i]]>dis[u[i]]+w[i]){
dis[v[i]]=dis[u[i]]+w[i];
}
}
}
for(i=1;i<=n;i++){
printf("%d ",dis[i]);
}
return 0;
}
检测负权环并且优化dis数组的
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#include <set>
#include <ctype.h>//isalpha,isdight,toupper
#include <map>
#include <sstream>
typedef long long ll;
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=25;
int main(){
int dis[10],n,m,u[10],v[10],w[10],check,flag;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u[i],&v[i],&w[i]);
}
for(int i=1;i<=n;i++){
dis[i]=inf;
}
dis[1]=0;
for(int k=1;k<=n-1;k++){
check=0;
for(int i=1;i<=m;i++){
if(dis[v[i]]>dis[u[i]]+w[i]){
dis[v[i]]=dis[u[i]]+w[i];
check=1;
}
}
if(check==0)break;
}
flag=0;
for(int i=1;i<=m;i++){
if(dis[v[i]]>dis[u[i]]+w[i]){
flag=1;
}
}
if(flag)cout<<"此图含有负权环"<<endl;
else{
for(int i=1;i<=n;i++){
printf("%d ",dis[i]);
}
}
return 0;
}
队列优化的Bellman - ford算法
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#include <set>
#include <ctype.h>//isalpha,isdight,toupper
#include <map>
#include <sstream>
typedef long long ll;
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=25;
int main(){
int n,m,i,j,k;
int u[8],v[8],w[8];
int first[6],next[8];
int dis[6]={0},vis[6]={0};
int que[101]={0},head=1,tail=1;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
dis[i]=inf;
}
dis[1]=0;
for(i=1;i<=n;i++){
vis[i]=0;
}
for(i=1;i<=n;i++){
first[i]=-1;
}
for(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(dis[v[k]]>dis[u[k]]+w[k]){
dis[v[k]]=dis[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(i=1;i<=n;i++){
printf("%d ",dis[i]);
}
return 0;
}