#include <iostream>
#include<stdio.h>
#include<string.h>
#define INF 9999999
using namespace std;
int MAP[110][110],dis[110],flag[110];
int MIN,n,i,j,m;
void init()
{
// cout<<n<<" "<<m<<endl;
int a,b,c;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++) //初始图无穷大表示无边
{
MAP[i][j]=INF;
}
for(i=1; i<=m; i++)
{
cin>>a>>b>>c;
MAP[a][b]=c; //无向图要存两次
MAP[b][a]=c;
}
/* for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
cout<<MAP[i][j]<<" ";
cout<<endl;
}*/
for(i=1; i<=n; i++)
{
dis[i] = (i==1? 0: INF); //只有1的距离是零其余初始化为无穷
}
memset(flag,0,sizeof(flag));// 标记点是否访问过
}
int Min(int a,int b)
{
if(a<b)
return a;
else
return b;
}
void dijkstra()
{
int x,y;
for(i=1; i<=n; i++)
{
MIN=INF;
for(y=1; y<=n; y++)
{
if(flag[y]==0&&dis[y]<MIN)
{
MIN=dis[y]; // 遍历出距离近的点加入集合
x=y;
}
}
flag[x]=1;
for(y=1; y<=n; y++)
{
dis[y]=Min(dis[y],dis[x]+MAP[x][y]); // 最近的点更新距离数组
}
/* for(int j=1; j<=n; j++)
cout<<dis[j]<<" ";
cout<<endl;*/
}
}
int main()
{
while(cin>>n>>m)
{
init();
dijkstra();
cout<<dis[n]<<endl;
}
return 0;
}
dijkstra 最短路
最新推荐文章于 2022-09-01 22:06:47 发布