今天看了看bellman算法.
其实我觉得应该是先有的bellman算法的,因为毕竟dijkstra涉及到的思想还是比较多的,贪心啦,动态规划了,,很多很多.
而bellman我就发现其实我一直吧dijkstra按着bellman理解的...汗....
反正不管怎么样,,还是理解了算法的思想了.
其实bellman编起来还是挺顺手的,一次就ok了///
而且还学了一种比较洋气的存边的方法,就是二维数组存边...嘿嘿.
贴出代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define inf 0x3fffffff
int N,M;//N represents the number of points,and M stands for the number of edges;
int e[10005][3];
int path[105];
int visit[105];
int temp;
int dis[105];
int relax(int a,int b,int val)
{
if(dis[b]>dis[a]+val)
{
dis[b]=dis[a]+val;
path[b]=a;
return 1;
}
return 0;
}
int Bellman()
{
for(int i=1;i<=N;i++)
{
dis[i]=inf;
path[i]=-1;
}
dis[1]=0;
for(i=1;i<N;i++)
{
int flag=0;
for(int j=1;j<=2*M;j++)
{
if(relax(e[j][0],e[j][1],e[j][2]))
flag=1;
}
if(!flag)
break;
}
for(i=1;i<=2*M;i++)
{
if(relax(e[i][0],e[i][1],e[i][2]))
temp=1;
}
return dis[N];
}
int main()
{
while(scanf("%d%d",&N,&M),N|M)
{
temp=0;
for(int i=1;i<=M;i++)
{
scanf("%d%d%d",&e[i][0],&e[i][1],&e[i][2]);
e[i+M][0]=e[i][1];
e[i+M][1]=e[i][0];
e[i+M][2]=e[i][2];
}
int ans=Bellman();
//if(temp==1)
// printf("Yes\n");
// else
// printf("No\n");
// for(i=1;i<=N;i++)
// {
// printf("$$$$_%d____%d\n",i,path[i]);
// }
if(ans==inf)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}