标签:
题目http://acm.hdu.edu.cn/showproblem.php?pid=2544
模板题
#include<cstdio>
#include<cstring>//memset
#include<algorithm>//min
#define INF 0x3f3f3f3f
#define maxn 110
using namespace std;//algorithm
int n,m,map[maxn][maxn],dis[maxn];//map[][]两点之间的距离 dis[]起始点(源点)到当前点的距离
bool visit[maxn];//判断该点是否被访问
void dijkstra(int s)
{
int next;//下一个进入(最短距离) V集合的点
memset(visit,0,sizeof(visit));// 一开始 V集合中无任何元素
// memset(map,INF,sizeof(map));
for(int i=1;i<=n;i++)//dis初始化 起始点(源点)到当前点的距离
dis[i]=map[s][i];
visit[s]=true;//将源点放入集合V
dis[s]=0;//源点到源点的距离为0
for(int i=1;i<n;i++)//已经把U集合中的一个点存入V集合 最多进行n-1次寻找最小值
{
int temp=INF;// 一开始默认两点之间的距离为INF
for(int u=1;u<=n;u++)
{
if(!visit[u]&&dis[u]<temp)//找最小值(该点不在V集合 并且 该点到源点的距离小于 当前值 )
{
temp=dis[u];
next=u;
}
}
visit[next]=true;//将离源点最近的点存入V集合
for(int u=1;u<=n;u++)//松弛
{
if(!visit[u])
dis[u]=min(dis[u],dis[next]+map[next][u]);
}
}
}
int main()
{
int a,b,c;
while(scanf("%d%d",&n,&m),n,m)
{
memset(map,INF,sizeof(map));// 不能在dijkstra()中初始化 对map[][]赋值前初始化
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)//避免重复 上面初始化为INF map仍为INF表示未走过这条路
map[a][b]=map[b][a]=c;
}
dijkstra(1);
printf("%d\n",dis[n]);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/qq_29606781/article/details/47750217