今天终于抽出空闲时间了,(感觉这样说好像自己好忙啊!大部分时间都不知道干甚么了我),我要补题了,
这一个是我要说最短路的另一种算法叫Bellman-Ford,很高大上吧!
这个算法主要思想是挨个的遍历,一共遍历(点的数减一)次
主要优点是可以解决负权问题,当然这就不可能是双向的了,而我的这个例题是双向的所以要稍加修改
具体的我还是用我以前的一个题来做
图结构练习——最短路径
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
输入
输出
示例输入
3 2 1 2 1 1 3 1 1 0
示例输出
1 0
提示
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define MAX 0x3f3f3f3f
using namespace std;
int dis[100005];
int b[100005];
struct node
{
int x;
int y;
int z;
}a[1000005];
int main()
{
int n,m,i,j;
while(~scanf("%d %d",&n,&m))
{
for(i = 1 ; i <= 2*m; i++)
{
scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].z);
i++;
a[i].x = a[i-1].y; //这里由于图是双向的所以要重复储存
a[i].y = a[i-1].x;
a[i].z = a[i-1].z;
}
for(i = 1; i <= n; i++)
{
dis[i] = MAX;
}
dis[1] = 0;
for(j = 1; j <= n-1; j++)
{
for(i = 1; i <= 2*m; i++)
{
if(dis[a[i].y] > dis[a[i].x]+a[i].z)
{
dis[a[i].y] = dis[a[i].x]+a[i].z;
}
}
}
printf("%d\n",dis[n]);
}
}
代码菜鸟,如有错误,请多包涵!!