#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0xfffffff
int pri[1010][1010];//两个顶点之间距离
int dis[1010];//起点到该点的最短距离
int vis[1010];//标记数组
int n,m;
void floyd()
{
for(int k=1;k<=n;k++)//中间点
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
pri[i][j]=min(pri[i][j],pri[i][k]+pri[k][j]);
}
}
}
}
void dijkstra()
{
memset(vis,0,sizeof(vis));
vis[1]=1;
for(int i=2;i<=n;i++)
dis[i]=pri[1][i];
for(int i=0;i<n;i++)
{
int M=INF,k=-1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<M)
M=dis[j],k=j;
}
if(k==-1)
return ;
vis[k]=1;
for(int j=1;j<=n;j++)
if(!vis[j]&&dis[j]>dis[k]+pri[k][j])
dis[j]=dis[k]+pri[k][j];
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF,n||m)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
pri[i][j]=i==j?0:INF;
for(int i=1;i<=m;i++)
{
int a,b,c;scanf("%d%d%d",&a,&b,&c);
if(pri[a][b]>c)
pri[a][b]=pri[b][a]=c;
}
//dijkstra();
floyd();
printf("%d\n",pri[1][n]);
}
return 0;
}
最短路Floyd、Dijkstra
最新推荐文章于 2021-06-06 10:35:28 发布