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; }