#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f;
int vis[1111],dis[1111],a[111][111],n,m;
void Dij(int s)
{
memset(dis,INF,sizeof(INF));
for(int i=1; i<=n; i++)
dis[i]=a[s][i];
vis[s]=1; //将当前位置标记
//dis[s]=0; //dis数组在当前点的值已经在上面赋值过了,这里可不加
for(int i=1; i<=n-1; i++)
{
int minn=INF; //找离源点最近的那条路的权值,并用u记录该点
int u;
for(int j=1; j<=n; j++)
{
if(vis[j]==0&&dis[j]<minn)
{
minn=dis[j];
u=j;
}
}
vis[u]=1; //找到后,该点离源点的距离便成为了确定值,并标记
for(int v=1; v<=n; v++)
{
if(a[u][v]<INF&&vis[v]==0) //这里的标记条件可不加,加上是为了减少复杂度
{
dis[v]=min(dis[v],dis[u]+a[u][v]); //用已有确定值来更新各点
}
}
}
}
int main()
{
while(cin>>n>>m)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
a[i][j]=0;
else
a[i][j]=INF;
}
}
for(int i=1; i<=m; i++)
{
int u,v,w;
cin>>u>>v>>w;
if(a[u][v]>w) //题目没有明确要求,真是坑我,这是避免覆盖最短路,因为可能有重边
{
a[u][v]=w;
a[v][u]=w;
}
}
Dij(1);
cout<<dis[n]<<endl;
}
return 0;
}
图结构练习——最短路径->Dijkstra算法--单源最短路
猜你喜欢
转载自blog.csdn.net/weixin_43824158/article/details/86360059
今日推荐
周排行