普通写法

Bellman-Ford 随笔 第1张
#include<iostream>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int main() {
    int dis[10],u[10],v[10],w[10],n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++) cin>>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++)
        for(int i=1;i<=m;i++)
            if(dis[v[i]]>dis[u[i]]+w[i])
                dis[v[i]]=dis[u[i]]+w[i];
    //检测有无负权回路 
    int flag=0;
    for(int i=1;i<=m;i++)
        if(dis[v[i]]>dis[u[i]]+w[i]) flag=1;
    if(flag==1) cout<<"有负权回路"<<endl;
     
    for(int i=1;i<=n;i++) cout<<dis[i]<<' ';
    return 0;
}
View Code

队列优化:每次仅对最短路估计值发生变化的顶点松弛 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。 Bellman-Ford 随笔 第3张
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
int main() {
    int n,m;
    cin>>n>>m;
    int u[8],v[8],w[8];
    int first[6],next[6];
    int dis[6],book[6];//book用来记录哪些点在队列中 
    int que[101],head=1,tail=1; 
    memset(que,0,sizeof(que));
    memset(book,0,sizeof(book));
    for(int i=1;i<=n;i++) dis[i]=inf;
    dis[1]=0;
    for(int i=1;i<=n;i++) first[i]=-1;
    for(int i=1;i<=m;i++) {
        cin>>u[i]>>v[i]>>w[i];
        next[i]=first[u[i]];
        first[u[i]]=i;
    }
    que[tail++]=1;
    book[1]=1;
    while(head<tail) { 
        int 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(book[v[k]]==0) { //不在队列中 
                    que[tail++]=v[k];
                    book[v[k]]=1;
                }
            }
            k=next[k];
        }
        //出队 
        book[que[head]]=0;
        head++;
    }
    for(int i=1;i<=n;i++) cout<<dis[i]<<" ";
    return 0;
}
View Code

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄