spfa模板题,用的邻接矩阵存储。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<vector>
#include<cstring>
using namespace std;
#define maxn 999999
int n,m,map[110][110],dist[110],vis[110],a,b,c,ans;
queue<int>q;
int spfa(int x)
{
int i;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
dist[i]=maxn;
q.push(x);//将该点入队
vis[x]=1;//设置其为已访问
dist[x]=0;
while(!q.empty())
{
int cur=q.front();
q.pop();//出队
for(i=1;i<=n;i++)
if(dist[i]>dist[cur]+map[cur][i])
{
dist[i]=dist[cur]+map[cur][i];
if(!vis[i])
{
vis[i]=1;
q.push(i);
}
}
vis[cur]=0;
}
return dist[n];
}
int main()
{
int i,j,k;
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=maxn;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}
ans=spfa(1);
printf("%d\n",ans);
}
return 0;
}