题目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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-04 21:14:16