日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 2066 一个人的旅行

發(fā)布時間:2025/4/9 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 2066 一个人的旅行 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

http://acm.hdu.edu.cn/showproblem.php?pid=2066

題意:

輸入數(shù)據(jù)有多組,每組的第一行是三個整數(shù)T,S和D,表示有T條路,和草兒家相鄰的城市的有S個,草兒想去的地方有D個。?接著有T行,每行有三個整數(shù)a,b,time,表示a,b城市之間的車程是time小時;(1=<(a,b)<=1000;a,b 之間可能有多條路) 。

?接著的第T+1行有S個數(shù),表示和草兒家相連的城市。

?接著的第T+2行有D個數(shù),表示草兒想去地方。

?

思路:

需要注意一點,a,b可能有多條路,保存最短路。

1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 #include<algorithm> 5 using namespace std; 6 7 #define INF 1000001 8 9 int T, S, D, n; 10 11 int d[1005][1005]; 12 int e[1005]; 13 int vis[1005], num[1005]; 14 15 16 void Dijkstra() 17 { 18 int min, pos; 19 vis[0] = 1; 20 for (int i = 0; i <= n; i++) 21 num[i] = d[0][i]; 22 for (int i = 1; i <= n; i++) 23 { 24 min = INF; 25 for (int j = 1; j <= n; j++) 26 { 27 if (num[j] < min && !vis[j]) 28 { 29 pos = j; 30 min = num[j]; 31 } 32 } 33 if (min == INF) break; 34 vis[pos] = 1; 35 for (int j = 1; j <= n; j++) 36 { 37 if (num[pos] + d[pos][j] < num[j] && !vis[j]) 38 num[j] = num[pos] + d[pos][j]; 39 } 40 } 41 } 42 43 int main() 44 { 45 //freopen("D:\\txt.txt", "r", stdin); 46 int a, b, t; 47 while (~scanf("%d%d%d", &T, &S, &D)) 48 { 49 n = 0; 50 memset(vis, 0, sizeof(vis)); 51 for (int i = 0; i <= 1005; i++) 52 { 53 d[i][i] = 0; 54 for (int j = i + 1; j <= 1005; j++) 55 d[i][j] = d[j][i] = INF; 56 } 57 58 for (int i = 0; i < T; i++) 59 { 60 scanf("%d%d%d", &a, &b, &t); 61 n = max(n, max(a, b)); 62 if (t<d[a][b]) d[a][b] = d[b][a] = t; //這兒需要注意一下,因為兩個點之間可能有多條路徑,保存最短路 63 } 64 65 //把家和0點的距離設(shè)為0,這樣從0出發(fā)肯定最先是家 66 for (int i = 0; i < S; i++) 67 { 68 scanf("%d", &a); 69 d[0][a] = d[a][0] = 0; 70 } 71 72 for (int i = 0; i < D; i++) 73 scanf("%d", &e[i]); 74 75 Dijkstra(); 76 77 int ans = INF; 78 for (int i = 0; i < D; i++) 79 ans = min(ans, num[e[i]]); 80 printf("%d\n", ans); 81 } 82 return 0; 83 }

?

本來是想用Floyd的,但是不行,超時了。

1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 #include<algorithm> 5 using namespace std; 6 7 #define INF 1000001 8 9 int T, S, D; 10 11 int d[1005][1005]; 12 int e[1005]; 13 int vis[1005]; 14 int p[1005]; 15 16 17 int main() 18 { 19 //freopen("D:\\txt.txt", "r", stdin); 20 int a, b, t; 21 while (~scanf("%d%d%d", &T, &S, &D)) 22 { 23 int cnt = 1; 24 for (int i = 0; i <= 1000; i++) 25 { 26 d[i][i] = 0; 27 for (int j = i + 1; j <= 1000; j++) 28 d[i][j] = d[j][i] = INF; 29 } 30 p[0] = 0; 31 for (int i = 0; i < T; i++) 32 { 33 scanf("%d%d%d", &a, &b, &t); 34 if (!vis[a]) 35 { 36 vis[a] = 1; 37 p[cnt++] = a; 38 } 39 if (!vis[b]) 40 { 41 vis[b] = 1; 42 p[cnt++] = b; 43 } 44 if(t < d[a][b]) d[a][b] = d[b][a] = t; 45 } 46 47 for (int i = 0; i < S; i++) 48 { 49 scanf("%d", &a); 50 d[0][a] = 0; 51 d[a][0] = 0; 52 } 53 for (int i = 0; i < D; i++) 54 scanf("%d", &e[i]); 55 56 for (int k = 0; k < cnt; k++) 57 for (int i = 0; i < cnt; i++) 58 for (int j = 0; j < cnt; j++) 59 d[p[i]][p[j]] = min(d[p[i]][p[j]], d[p[i]][p[k]] + d[p[k]][p[j]]); 60 61 62 int ans = INF; 63 for (int j = 0; j < D; j++) 64 ans = min(ans, d[0][e[j]]); 65 printf("%d\n", ans); 66 67 for (int i = 0; i < cnt; i++) 68 vis[p[i]] = 0; 69 } 70 return 0; 71 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/zyb993963526/p/6389442.html

總結(jié)

以上是生活随笔為你收集整理的HDU 2066 一个人的旅行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。