Bellman-Ford算法——最短路径问题

´这个方法基于一点:最短路最多只经过n-1个节点(如果没有负环)
´首先,没有负环;
´然后对于其余的环,我们总可以选择不通过这些环而长度不会更差;
´因此,实际上我们可以通过采取n-1轮对于所有边的松弛操作解决该问题。
 
´算法流程:
´初始化dis数组
´进行n-1轮操作
´每一轮依次检查每一条边,进行松弛操作
´n-1轮操作结束后,dis数组即记录单源最短路径的信息
 
´实际上当把这算法用于判断是否有负环的时候,我们只需要查看在n-1轮松弛之后,再进行一轮松弛检验,如果仍存在松弛,那么一定存在负环
 
#include <bits/stdc++.h>
using namespace std;

const int maxn=1000;
const int maxm=10000;
const int oo=100000000;
int n,m,x[maxm],y[maxm],z[maxm];
int dis[maxn];
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x[i],&y[i],&z[i]);
    }
    for (int i=2;i<=n;i++) dis[i]=oo;
    for (int i=1;i<n;i++)
     for (int j=1;j<=m;j++)
      if (dis[x[j]]!=oo && dis[y[j]]>dis[x[j]]+z[j])
       dis[y[j]]=dis[x[j]]+z[j];
    for (int j=1;j<=m;j++)
     if (dis[x[j]]!=oo && dis[y[j]]>dis[x[j]]+z[j])
      {
            printf("-1\n");
            return 0;
            }
    for (int i=1;i<=n;i++) 
         printf("%d ",dis[i]);
    printf("\n");
    return 0;
 } 

 

posted @ 2017-01-25 16:30  Mr.9Pounds15Pence  阅读(140)  评论(0编辑  收藏  举报