hdu2680 Choose the best route

多点到一点的最短距离,因为点的编号是从1到n所以把0作为新的起点

将所有可能的起点跟0连接,转换为求单源最短路径用dijkstra即可。

复制代码
1 #include <stdio.h>
2 #include <string.h>
3
4  #define INF 999999999
5  #define MAX 1007
6
7 int n,map[MAX][MAX];
8 int dijkstra(int str, int end){
9 bool hash[MAX];
10 int i,min,path[MAX];
11
12 for(i = 0; i <= n; i++){
13 hash[i] = true;
14 path[i] = INF;
15 }
16 hash[str] = false;
17 path[str] = 0;
18 while(str != end){
19 for(i = 0; i <= n; i++){
20 if(map[str][i])
21 if(path[i] > path[str] + map[str][i])
22 path[i] = path[str] + map[str][i];
23 }
24
25 min = INF;
26 for(i = 0; i <= n; i++){
27 if(path[i] < min && hash[i]){
28 min = path[i];
29 str = i;
30 }
31 }
32 if(min == INF)
33 break;
34 hash[str] = false;
35 }
36 return path[end];
37 }
38
39 int main (void){
40 int i,m,s,p,q,t,w,ans;
41 while(scanf("%d%d%d",&n,&m,&s)!=EOF){
42 memset(map,0,sizeof(map));
43 for(i = 0; i < m; i++){
44 scanf("%d%d%d",&p,&q,&t);
45 if(!map[p][q])
46 map[p][q] = t;
47 else if(map[p][q] > t)
48 map[p][q] = t;
49 }
50 scanf("%d",&w);
51 for(i = 0; i < w; i++){
52 scanf("%d",&q);
53 map[0][q] = 1;
54 }
55 ans = dijkstra(0,s);
56 if(ans != INF)
57 printf("%d\n",ans - 1);
58 else
59 printf("-1\n");
60 }
61 return 0;
62 }
复制代码

posted on   死线之蓝  阅读(221)  评论(0)    收藏  举报

编辑推荐:
· WPF 引用 ASP.NET Core 的 AOT 版本
· 通过 Canvas 将后端发来的一帧帧图片渲染成“视频”的实现过程
· 当加密ID需要变成Guid:为什么我选择了AES-CBC而非GCM?
· 基于 epoll 的协程调度器——零基础深入浅出 C++20 协程
· 下划线字段在golang结构体中的应用
阅读排行:
· 我的AI自学路线,可能对你有用
· WPF 引用 ASP.NET Core 的 AOT 版本
· 纯 C#实现+AOT 打造的智能PDF目录提取工具 PdfTocExtractor
· C# 13 与 .NET 9 跨平台开发实战(第一章:开发环境搭建与.NET概述-下篇)
· 深入理解 C# 异步编程:同步、Task.Wait () 与 await 的本质区别及实践指南

导航

< 2011年4月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
1 2 3 4 5 6 7

统计

点击右上角即可分享
微信分享提示