一道图论模板题。
三种方法:
代码如下:
#include<stdio.h>
#include<string.h>
#include<limits.h>
int mp[102][102];
int divs[102];
int vis[102];
int m,n;
const int mx=10000000;
int dij(int a)
{
for(int i=1; i<=n; i++)
divs[i]=mp[a][i];
divs[a]=0;
vis[a]=1;
for(int i=1; i<n; i++)
{
int min=mx;
int t=-1;
for(int j=1; j<=n; j++)
if(!vis[j]&&divs[j]<min)
min=divs[j],t=j;
vis[t]=1;
for(int j=1; j<=n; j++)
if(!vis[j]&&divs[j]>mp[t][j]+divs[t])
divs[j]=mp[t][j]+divs[t];
}
return divs[n];
}
/*
int floyed()
{
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(mp[i][j]>mp[i][k]+mp[k][j])
mp[i][j]=mp[i][k]+mp[k][j];
return mp[1][n];
}
*/
/***
int spfa()
{
memset(visit, 0, sizeof(visit));
for(i = 1; i <= n; i++) divs[i] = mx;
divs[1] = 0;
queue<int> Q;
Q.push(1);
visit[1] = 1;
while(!Q.empty())
{
int now = Q.front();
Q.pop();
visit[now] = false;
for(int i = 1; i <= n; i++)
{
if(divs[i] > divs[now] + mp[now][i])
{
divs[i] = divs[now] + mp[now][i];
if(!visit[i])
{
Q.push(i);
visit[i] = 1;
}
}
}
}
return divs[n];
}
*/
void init()
{
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
{
if(i==j)
mp[i][j]=0;
else
mp[i][j]=mx;
}
memset(vis,0,sizeof(vis));
}
int main()
{
while(~scanf("%d%d",&n,&m),n+m)
{
init();
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
mp[a][b]=c;
mp[b][a]=c;
}
printf("%d\n",dij(1));
//printf("%d\n",floyed());
///printf("%d\n",spfa());
}
return 0;
}