HDU_2544
直接用队列优化的Bellman-Ford算法求到各个点的最短路即可。
#include<stdio.h>
#include<string.h>
int N,M,G[110][110],d[110];
int q[110],inq[110];
int init()
{
int i,A,B,C;
scanf("%d%d",&N,&M);
if(!N&&!M)
return 0;
memset(G,0,sizeof(G));
for(i=0;i<M;i++)
{
scanf("%d%d%d",&A,&B,&C);
G[A][B]=G[B][A]=C;
}
return 1;
}
int SPFA()
{
int i,j,k,u,v,front,rear;
for(i=1;i<=N;i++)
d[i]=1000000000;
d[1]=0;
front=rear=0;
memset(inq,0,sizeof(inq));
q[rear++]=1;
inq[1]=1;
while(front!=rear)
{
u=q[front++];
inq[u]=0;
if(front>N)
front=0;
for(v=1;v<=N;v++)
if(G[u][v]&&d[u]+G[u][v]<d[v])
{
d[v]=d[u]+G[u][v];
if(!inq[v])
{
q[rear++]=v;
inq[v]=1;
if(rear>N)
rear=0;
}
}
}
return d[N];
}
int main()
{
int i,j,k,n;
while(init())
printf("%d\n",SPFA());
return 0;
}