这道题也是死命TLE。。

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

  1. /*
  2. 使用pair代替结构
  3. */
  4.  
  5. #include <iostream>
  6. #include <cstdio>
  7. #include <queue>
  8. #include <vector>
  9. using namespace std;
  10. const int Ni = ;
  11. const int INF = 0x3f3f3f3f;
  12.  
  13. typedef pair<int,int> pa;
  14.  
  15. int dis[Ni],n;//dis使用1-n的部分
  16.  
  17. vector<pair<int,int> > eg[Ni];
  18.  
  19. void Dijkstra(int s)
  20. {
  21. int i,j;
  22. for(i=;i<=n;i++)//要到n
  23. dis[i] = INF;
  24. priority_queue<pa> q; //优先级队列:小顶堆
  25. dis[s] = ;
  26. q.push(make_pair(s,dis[s]));
  27.  
  28. while(!q.empty())
  29. {
  30. pa x = q.top();
  31. q.pop();
  32. int w = x.first;
  33. for(j = ;j<eg[w].size();j++)//遍历x的所有邻接点
  34. {
  35. pa y = eg[w][j];//y是x的邻接点
  36. int u = y.first;
  37. if(dis[u]>x.second+y.second)
  38. {
  39. dis[u] = x.second+y.second;
  40. q.push(make_pair(u,dis[u]));
  41. }
  42. }
  43. }
  44.  
  45. }
  46.  
  47. int main()
  48. {
  49. int m,a,b,y,d,min;//关系个数
  50. while(cin>>n>>m>>y)
  51. {
  52. for(int i = ;i<=n;i++)
  53. eg[i].clear();//初始化
  54. while(m--)
  55. {
  56. cin>>a>>b>>d;
  57. eg[b].push_back(make_pair(a,d));
  58. }
  59.  
  60. Dijkstra(y);
  61.  
  62. int t,x;
  63. min = INF;
  64. cin>>t;
  65. while(t--)
  66. {
  67. cin>>x;
  68. if(dis[x]<min)
  69. min = dis[x];
  70. }
  71. if(min!=INF)
  72. cout<<min<<endl;
  73. else
  74. cout<<"-1\n";
  75. }
  76.  
  77. return ;
  78. }

已ac,514MS

思路1:加辅助点

  1. #include <cstdio>
  2. using namespace std;
  3. const int L = ;
  4. const int INF = <<;
  5.  
  6. int map[L][L];
  7. int vis[L];
  8. int dis[L];
  9.  
  10. int n,m;
  11.  
  12. void Dijkstra()
  13. {
  14. int i,j,k;
  15. int min;
  16. for(i = ;i<=n;i++)
  17. {
  18. dis[i] = map[][i];
  19. vis[i] = ;
  20. }
  21.  
  22. vis[] = ;
  23. dis[] = ;
  24.  
  25. for(i = ;i<=n;i++)
  26. {
  27. min = INF;
  28. for(j = ;j<=n;j++)
  29. {
  30. if(dis[j]<min && !vis[j])
  31. {
  32. k = j;
  33. min = dis[j];
  34. }
  35. }
  36.  
  37. vis[k] = ;
  38.  
  39. for(j = ;j<=n;j++)
  40. {
  41. if(dis[j] > min+map[k][j] && !vis[j])
  42. {
  43. dis[j] = min+map[k][j];
  44. }
  45. }
  46. }
  47. }
  48.  
  49. void init()
  50. {
  51. int i,j;
  52. for(i = ;i<=n;i++)
  53. {
  54. map[i][i] = ;
  55. for(j = i+;j<=n;j++)
  56. {
  57. map[i][j] = map[j][i] = INF;
  58. }
  59. }
  60.  
  61. while(m--)
  62. {
  63. int a,b,w;
  64. scanf("%d%d%d",&a,&b,&w);
  65. if(w<map[a][b])//可能有同两点,但不同weight
  66. {
  67. map[a][b] = w;
  68. }
  69. }
  70. }
  71.  
  72. int main()
  73. {
  74. int y;
  75. while(~scanf("%d%d%d",&n,&m,&y))
  76. {
  77. int r,min=INF;
  78.  
  79. init();
  80.  
  81. scanf("%d",&r);
  82. while(r--)
  83. {
  84. int a;
  85. scanf("%d",&a);
  86. map[][a] = ;
  87. }
  88.  
  89. Dijkstra();
  90.  
  91. if(dis[y]!=INF)
  92. printf("%d\n",dis[y]);
  93. else
  94. printf("-1\n");
  95.  
  96. }
  97.  
  98. return ;
  99. }

思路2:反向图

  1. #include <cstdio>
  2. using namespace std;
  3. const int L = ;
  4. const int INF = <<;
  5.  
  6. int map[L][L];
  7. int vis[L];
  8. int dis[L];
  9.  
  10. int n,m;
  11.  
  12. void Dijkstra(int s)
  13. {
  14. int i,j,k;
  15. int min;
  16. for(i = ;i<=n;i++)
  17. {
  18. dis[i] = map[s][i];
  19. vis[i] = ;
  20. }
  21.  
  22. vis[s] = ;
  23. dis[s] = ;
  24.  
  25. for(i = ;i<=n;i++)
  26. {
  27. min = INF;
  28. for(j = ;j<=n;j++)
  29. {
  30. if(dis[j]<min && !vis[j])
  31. {
  32. k = j;
  33. min = dis[j];
  34. }
  35. }
  36.  
  37. vis[k] = ;
  38.  
  39. for(j = ;j<=n;j++)
  40. {
  41. if(dis[j] > min+map[k][j] && !vis[j])
  42. {
  43. dis[j] = min+map[k][j];
  44. }
  45. }
  46. }
  47. }
  48.  
  49. void init()
  50. {
  51. int i,j;
  52. for(i = ;i<=n;i++)
  53. {
  54. map[i][i] = ;
  55. for(j = i+;j<=n;j++)
  56. {
  57. map[i][j] = map[j][i] = INF;
  58. }
  59. }
  60.  
  61. while(m--)
  62. {
  63. int a,b,w;
  64. scanf("%d%d%d",&a,&b,&w);
  65. if(w<map[b][a])//可能有同两点,但不同weight
  66. {
  67. map[b][a] = w;
  68. }
  69. }
  70. }
  71.  
  72. int main()
  73. {
  74. int y;
  75. while(~scanf("%d%d%d",&n,&m,&y))
  76. {
  77. int r,min=INF;
  78.  
  79. init();
  80.  
  81. Dijkstra(y);
  82.  
  83. scanf("%d",&r);
  84. while(r--)
  85. {
  86. int a;
  87. scanf("%d",&a);
  88. if(dis[a]<min)
  89. min = dis[a];
  90. }
  91.  
  92. if(min!=INF)
  93. printf("%d\n",min);
  94. else
  95. printf("-1\n");
  96.  
  97. }
  98.  
  99. return ;
  100. }

http://blog.csdn.net/niushuai666/article/details/6794343

这两个思路很值得学习,而且他的两个方法都比我快

HDU 2680(最短路)(多个起始点)的更多相关文章

  1. HDU - 2680 最短路 spfa 模板

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2680 题目大意,就是一个人可以从多个起点开始出发,看到终点的最短路是多少..只有可以运用和hdu2066 ...

  2. HDU 2680 最短路 迪杰斯特拉算法 添加超级源点

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. hdu 2680(最短路)

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  4. ACM: HDU 2544 最短路-Dijkstra算法

    HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descrip ...

  5. UESTC 30 &&HDU 2544最短路【Floyd求解裸题】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  6. hdu 5521 最短路

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  7. HDU - 2544最短路 (dijkstra算法)

    HDU - 2544最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以 ...

  8. hdu 2680 Choose the best route

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Description One day , Kiki ...

  9. hdu 2680 Choose the best route (dijkstra算法)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2680 /************************************************* ...

随机推荐

  1. 苹果笔记本调整 pycharm 字体大小的地方

    我想,对于习惯了使用windows版本 或者 乌班图版本 的pycharm 的人而言, mac版本调节字体的地方藏的实在是太坑爹了.

  2. Python(简单计算器)

    参考:https://www.cnblogs.com/alex3714/articles/5169958.html import re ret = re.search('\([^()]+\)','(1 ...

  3. POJ 2196

    #include <iostream> using namespace std; int sum_10; int sum_12; int sum_16; int fun_10(int nu ...

  4. Mac 10.12安装FTP工具FileZilla

    说明:在Windows估计用的比较多,在Linux基本不用了,CRT和Xshell基本可以完成上传. 下载: (链接: https://pan.baidu.com/s/1bpaxmeN 密码: uuw ...

  5. ubuntu apache2 .htaccess 下配置 反向代理

    安装完apache2后, a2enmod rewrite //启用.htaccess规则 a2enmod proxy a2enmod proxy_http //启用反向代理支持 [P] 配置OK,就可 ...

  6. 将静态网页部署到git上访问

    1.将已有的项目放在github上 http://www.cnblogs.com/zqunor/p/6583182.html 2.出现错误解决方案 提交错误 http://blog.csdn.net/ ...

  7. Oracle练习笔记

    1 基本查询 SQL> --当前用户 SQL> show user USER 为 "SCOTT" SQL> --当前用户下的表 SQL> select * ...

  8. python笔记02-----字符串操作

    python中定义变量的字符串 str1 = "www"      #str1就是字符串了 一定用引号 或者直接使用"字符串."来调用内部的方法 1.字符串大小 ...

  9. 深度学习(二)BP求解过程和梯度下降

    一.原理 重点:明白偏导数含义,是该函数在该点的切线,就是变化率,一定要理解变化率. 1)什么是梯度 梯度本意是一个向量(矢量),当某一函数在某点处沿着该方向的方向导数取得该点处的最大值,即函数在该点 ...

  10. ubuntu关闭时间同步与centos更改时间

    环境:ubuntu 源于一次项目需要修改系统时间,但是每次修改后又被同步回网络时间,找了好久发现是这个原因: NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于 ...