标签:
本题链接:点击打开链接
本题大意:
输入n,m,s,代表标号为1--n,有m组数据,终点为s。每组数据输入两个点及权值。然后输入w,代表有w个起点,然后输入各起点。求起点到终点的最短时间。
解题思路:
本题也是最短路径问题。有多个起点,本题也是与hdu 一个人的旅行 采取相同的方法。另外选取一个点,将各起点据此点的距离记为0,并以此点最为起点。
具体请参考代码:
#include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f int map[1010][1010]; int dis[1010]; int mark[1010]; int n; void dijkstra()//dijkstra算法 { memset(mark,0,sizeof(mark)); for(int i=1;i<=n;i++) dis[i]=INF; dis[0]=0; for(int i=0;i<=n;i++) { int vir,min=INF; for(int j=0;j<=n;j++) if(!mark[j]&&dis[j]<min) { min=dis[j]; vir=j; } if(min==INF) break; mark[vir]=1; for(int j=0;j<=n;j++) if(!mark[j]&&dis[j]>dis[vir]+map[vir][j]) dis[j]=dis[vir]+map[vir][j]; } } int main() { int m,s,w,begin; while(scanf("%d%d%d",&n,&m,&s)!=EOF) { for(int i=0;i<1010;i++) for(int j=0;j<1010;j++) map[i][j]=INF; for(int i=0;i<m;i++) { int p,q,t; scanf("%d%d%d",&p,&q,&t); if(map[p][q]>t) map[p][q]=t; } scanf("%d",&w); for(int i=0;i<w;i++)//将各起点替换为一个起点 { scanf("%d",&begin); map[0][begin]=0; } dijkstra(); if(dis[s]==INF) printf("-1\n"); else printf("%d\n",dis[s]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu 2680 Choose the best route
标签:
原文地址:http://blog.csdn.net/lsgbb/article/details/47732295