[关闭]
@tenlee 2015-08-09T11:58:43.000000Z 字数 1011 阅读 1856

HDU 2066 一个人的旅行 (Dijkstra)

HDUOJ


题目链接

戳我

题目大意

样例解释

解题思路

代码

  1. //Author LJH
  2. //www.cnblogs.com/tenlee
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <cctype>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #define clc(a, b) memset(a, b, sizeof(a))
  14. #define LL long long
  15. using namespace std;
  16. const int inf = 0x3f;
  17. const int INF = 0x3f3f3f3f;
  18. const int maxn = 1e3+5;
  19. int g[maxn][maxn], dis[maxn];
  20. bool vis[maxn];
  21. int T, S, D, n;
  22. void Dijkstra()
  23. {
  24. clc(dis, INF);
  25. clc(vis, 0);
  26. dis[0] = 0;
  27. for(int i = 0; i <= n; i++)
  28. {
  29. int mark = -1, mindis = INF;
  30. for(int j = 0; j <= n; j++)
  31. {
  32. if(!vis[j] && dis[j] < mindis)
  33. {
  34. mindis = dis[j];
  35. mark = j;
  36. }
  37. }
  38. vis[mark] = 1;
  39. for(int j = 0; j <= n; j++)
  40. {
  41. if(!vis[j])
  42. {
  43. dis[j] = min(dis[j], dis[mark]+g[mark][j]);
  44. }
  45. }
  46. }
  47. }
  48. int main()
  49. {
  50. int a, b, c;
  51. while(~scanf("%d %d %d", &T, &S, &D))
  52. {
  53. clc(g, INF);
  54. for(int i = 0; i < T; i++)
  55. {
  56. scanf("%d %d %d", &a, &b, &c);
  57. g[a][b] = g[b][a] = g[a][b] < c ? g[a][b] : c;
  58. n = max(a, n);
  59. n = max(b, n);
  60. }
  61. for(int i = 0; i < S; i++)
  62. {
  63. scanf("%d", &a);
  64. g[0][a] = g[a][0] = 0; //增加源点
  65. }
  66. n++;
  67. for(int i = 0; i < D; i++)
  68. {
  69. scanf("%d", &a);
  70. g[a][n] = g[n][a] = 0; //增加汇点
  71. }
  72. Dijkstra();
  73. printf("%d\n", dis[n]);
  74. }
  75. return 0;
  76. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注