HDU - 2066 一个人的旅行
2015-07-31 23:14
197 查看
题目大意:中文题
解题思路:多源点,任意终点,最短路的变形,用dijkstra或者SPFA都可以,只要把源点设置为多个就可以
任意终点的,那就取每个终点的最小值就可以了
解题思路:多源点,任意终点,最短路的变形,用dijkstra或者SPFA都可以,只要把源点设置为多个就可以
任意终点的,那就取每个终点的最小值就可以了
[code]#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f #define N 1010 int dis , d ; int T, S, D, Max; bool vis ; void init(){ memset(dis, 0x3f, sizeof(dis)); Max = -1; int x, y, z; for (int i = 0; i < T; i++) { scanf("%d%d%d", &x, &y, &z); if (dis[x][y] > z) { dis[x][y] = dis[y][x] = z; } if (Max < x || Max < y) { Max = max(x, y); } } } int Dijkstra() { memset(vis, 0, sizeof(vis)); for (int i = 1; i <= Max; i++) { d[i] = INF; } int x; for (int i = 0; i < S; i++) { scanf("%d", &x); d[x] = 0; } for (int i = 1; i <= Max; i++) { int x, t = INF; bool flag = false; for (int j = 1; j <= Max; j++) if (t > d[j] && !vis[j]) { t = d[j]; x = j; flag = true; } if(!flag) break; vis[x] = true; for (int j = 1; j <= Max; j++) if (d[x] + dis[j][x] < d[j]) d[j] = d[x] + dis[j][x]; } int ans = INF; for (int i = 0; i < D; i++) { scanf("%d", &x); ans = min(ans, d[x]); } return ans; } int main() { while (scanf("%d%d%d", &T, &S, &D) != EOF) { init(); printf("%d\n",Dijkstra()); } return 0; }
相关文章推荐
- linux性能评测工具2-Google perftools
- Struts2 零配置(一)—配置文件 vs 零配置
- MAC 设置环境变量path的几种方法
- java中使用日志组件和mysql数据库
- 弗洛伊德算法
- maven的使用和入门
- Mysql字符集以及校对规则
- excel导入MySQL 学习
- 用手机调试Android手机连上没反应解决办法
- 云存储基础架构剖析
- [V1.0]小木虫路径搜索问题C语言处理方案
- 神经网络-并行BP算法
- oracle-循环
- 没必要对央行网络支付办法恐慌
- 【设计前沿】初级网页设计师需要注意事项
- 多校第4场1012
- C - Task schedule-二分
- 我跟敏捷开发的故事--三面墙
- python编程基础操作(1)—— list
- scala学习笔记(2)