刚才看了一下SPFA,很简单。时间有限,见BAIDU。说是BELLMAN的优化,不过我觉得更像DIJKSTRA
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 200
#define QSIZE 200
#define INF 9999999
int f[SIZE][SIZE];
int d[SIZE];
int inq[SIZE];
int que[QSIZE],head,tail,len;
int N,M;
int push(int x)
{
que[tail++]=x;
len++;
if(tail==QSIZE)
tail=0;
return 0;
}
int pop(int *x)
{
*x=que[head++];
len--;
if(head==QSIZE)
head=0;
return 0;
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
int i,x,t1,t2,t3;
while(scanf("%d%d",&N,&M),M||N)
{
memset(f,0,sizeof(f));
for(i=0;i<M;i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
f[t1][t2]=f[t2][t1]=t3;
}
for(i=1;i<=N;i++)
inq[i]=0, d[i]=INF;
head=tail=len=0;
push(1);
inq[1]=1;
d[1]=0;
while(len>0)
{
pop(&x);
inq[x]=0;
for(i=1;i<=N;i++)
if(f[x][i] && d[x]+f[x][i]<d[i])
{
d[i]=d[x]+f[x][i];
if(!inq[i])
push(i),inq[i]=1;
}
}
printf("%d\n",d[N]);
}
return 0;
}