hdu 2680 Choose the best route
2015-08-17 21:24
543 查看
本题链接:点击打开链接
本题大意:
输入n,m,s,代表标号为1--n,有m组数据,终点为s。每组数据输入两个点及权值。然后输入w,代表有w个起点,然后输入各起点。求起点到终点的最短时间。
解题思路:
本题也是最短路径问题。有多个起点,本题也是与hdu 一个人的旅行 采取相同的方法。另外选取一个点,将各起点据此点的距离记为0,并以此点最为起点。
具体请参考代码:
本题大意:
输入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; }
相关文章推荐
- 8-17
- 设计模式之工厂模式
- hadoop的RPC调用原理
- JS将下拉框的disable变为able的方法
- [LeetCode] Implement Trie (Prefix Tree)
- uva 10556 - Biometrics(几何)
- BNU Training 2015.08.17
- 删除百度搜索结果页山寨网站排名的方法
- Swing图形界面程序—同学通讯录系统(1)
- scanf
- 小P寻宝记——好基友一起走
- 大数据算法学习笔记(七):外存算法
- uva 10335 - Ray Inside a Polygon(几何)
- qq好友列表 模拟
- 小P寻宝记——粗心的基友
- POJ 2187 Beauty Contest(凸包求最远点距离)
- Buy or Build
- ZOJ3822——概率DP——Domination
- Office导入导出组件权限配置汇总
- Linux rpmbuild命令