最短路——Bellman-ford算法

求从一点出发,到各点的最短路

代码如下:

#include<cstdio>
#include<iostream>
const int inf=1000000;
using namespace std;
int m,n,x,y,dist[105];
bool flag=false;
struct line{       //存边的结构体
int x,y,w;
}L[105];
void input(){
int p,q,i,j,t;
scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    scanf("%d%d%d",&L[i].x,&L[i].y,&L[i].w);
scanf("%d%d",&x,&y);
}
void Bellman_ford(){
int i,j;
for(i=1;i<=n;i++)dist[i]=inf;      //初值
dist[x]=0;
for(i=1;i<=n;i++)   //进行n次松弛
 for(j=1;j<=m;j++)
   if(dist[L[j].x]+L[j].w<dist[L[j].y])
   dist[L[j].y]=dist[L[j].x]+L[j].w;
for(i=1;i<=m;i++)     //再次松弛,判断是否有负权回路
if(dist[L[j].x]+L[j].w<dist[L[j].y])
{flag=true;break;}     
printf("%d",dist[y]);
}
int main(){
input();
Bellman_ford();
}

时间复杂度为O(nm),可以判断出负权回路。

你可能感兴趣的:(最短路——Bellman-ford算法)