Dijkstr 最短路径算法:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define MAX 10000
using namespace std;
int n,m,s,e,vis[100],low[100],dis[210][210];
int dijkstra()
{
int i,min;
int pos=s;
memset(vis,0,sizeof(vis));
vis[pos]=1;
for(i=1; i<=n; i++)
low[i]=dis[pos][i];
low[pos]=0;
while(1)
{
min=MAX;
for(i=1; i<=n; i++)
if(!vis[i]&&low[i]<min)
{
min=low[i];
pos=i;
}
vis[pos]=1;
if(min==MAX)break;
for(i=1; i<=n; i++)
if(!vis[i]&&low[i]>low[pos]+dis[pos][i])
low[i]=low[pos]+dis[pos][i];
}
if(low[e]==MAX)
return -1;
return low[e];
}
int main()
{
int i,j,a,b,t;
while(scanf("%d%d",&n,&m),n+m)
{
for(i=0; i<=n; i++)
for(j=0; j<=n; j++)
dis[i][j]=MAX;
for(i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&t);
if(t<dis[a][b])dis[a][b]=dis[b][a]=t;
}
scanf("%d%d",&s,&e);
printf("%d\n",dijkstra());
}
return 0;
}