一.算法分析
这个算法的思路还是很清晰的,该算法以边作为主要研究对象。
首先我们考虑使用一个边,这边用邻接表类似的形式由u[i](储存起始点)v[i](储存终点)w[i](储存边长权值)来保存,那么是否可以通过这条边来使的我们的起点到这条边的终点的距离缩短呢?如果可以的话就缩短这个距离,如果不行的话就放弃,之后依照这个思路将所有的边都遍历一遍,然而这样就结束了么?当然不行!很容易就能想到这样很可能找不出一套有效路径,然而我们很容易就会发现,在已经产生一套最短路径之前每一次遍历都至少会诞生一个点的最短路径,那么在用n-1次一定可以产生一套路径的。
其实这个算法的思路和之前的Dijkstra很相似,只是Dijkstra使用的是点来松弛其它点,而本算法是实用边来松弛其它点
//
// main.cpp
// Bellman=Ford
//
// Created by 张嘉韬 on 16/3/14.
// Copyright © 2016年 张嘉韬. All rights reserved.
//
#include <iostream>
#include <cstring>
using namespace std;
int const maxn=99999999;
int main(int argc, const char * argv[]) {
freopen("/Users/zhangjiatao/Desktop/input.txt","r",stdin);
int n,m,u[50],v[50],w[50],dis[50];
cin>>n>>m;
memset(dis,0,sizeof(dis));
for(int i=2;i<=n;i++) dis[i]=maxn;
for(int i=1;i<=m;i++)
{
cin>>u[i]>>v[i]>>w[i];
}
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];
}
}
for(int i=1;i<=n;i++) cout<<dis[i]<<" ";
cout<<endl;
return 0;
}