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

【题意】

  • 给定一个有重边的无向图,T=20,n<=1000,m<=5000
  • 删去一条边,使得1~n的最短路最长
  • 求最短路最长是多少

【思路】

  • 一定是删最短路上的边
  • 可以先跑一个Dijkstra,求出最短路,然n后枚举删边
  • 朴素的Dijkstra为n^2,枚举删边(n条)需要的总时间复杂度是n^3
  • 堆优化Dijkstra(nlogn),总复杂度为n^2logn
  • 有多重边,用邻接矩阵不方便,用邻接表方便,删去的边标记一下就好

【Accepted】

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<string>
  6. #include<algorithm>
  7. #include<queue>
  8. #include<vector>
  9.  
  10. using namespace std;
  11. typedef long long ll;
  12. const int maxm=5e4*+;
  13. const int maxn=1e3+;
  14. const int inf=0x3f3f3f3f;
  15. int n,m;
  16. struct node
  17. {
  18. int to;
  19. int nxt;
  20. int w;
  21. }e[maxm];
  22. int head[maxn];
  23. int tot;
  24. bool vis[maxn];
  25. int dis[maxn];
  26. int pv[maxn];
  27. int pe[maxn];
  28. typedef pair<int,int> pii;
  29. void init()
  30. {
  31. memset(head,-,sizeof(head));
  32. tot=;
  33. }
  34.  
  35. void add(int u,int v,int w)
  36. {
  37. e[tot].to=v;
  38. e[tot].w=w;
  39. e[tot].nxt=head[u];
  40. head[u]=tot++;
  41. }
  42.  
  43. int Dij(int x)
  44. {
  45. priority_queue<pii,vector<pii>,greater<pii> >pq;
  46. memset(vis,false,sizeof(vis));
  47. memset(dis,inf,sizeof(dis));
  48. dis[]=;
  49. pq.push(make_pair(dis[],));
  50. // pq.push(pii(dis[1],1));
  51. while(!pq.empty())
  52. {
  53. pii cur=pq.top();
  54. pq.pop();
  55. int u=cur.second;
  56. if(vis[u]) continue;
  57. vis[u]=true;
  58. for(int i=head[u];i!=-;i=e[i].nxt)
  59. {
  60. if(i==x) continue;
  61. int w=e[i].w;
  62. int v=e[i].to;
  63. if(dis[u]+w<dis[v])
  64. {
  65. dis[v]=dis[u]+w;
  66. pq.push(make_pair(dis[v],v));
  67. if(x==-)
  68. {
  69. pv[v]=u;
  70. pe[v]=i;
  71. }
  72. }
  73. }
  74. }
  75. return dis[n];
  76. }
  77.  
  78. int Solve()
  79. {
  80. if(Dij(-)==inf)
  81. {
  82. return -;
  83. }
  84. int ans=;
  85. for(int i=n;i!=;i=pv[i])
  86. {
  87. ans=max(ans,Dij(pe[i]));
  88. if(ans==inf)
  89. {
  90. return -;
  91. }
  92. }
  93. return ans;
  94. }
  95. int main()
  96. {
  97. int T;
  98. scanf("%d",&T);
  99. while(T--)
  100. {
  101. init();
  102. scanf("%d%d",&n,&m);
  103. while(m--)
  104. {
  105. int u,v,w;
  106. scanf("%d%d%d",&u,&v,&w);
  107. add(u,v,w);
  108. add(v,u,w);
  109. }
  110. int ans=Solve();
  111. printf("%d\n",ans);
  112. }
  113. return ;
  114. }

堆优化的Dijkstra

【Dijstra堆优化】HDU 3986 Harry Potter and the Final Battle的更多相关文章

  1. hdu 3986 Harry Potter and the Final Battle (最短路径)

    Harry Potter and the Final Battle Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/6553 ...

  2. hdu 3986 Harry Potter and the Final Battle

    一个水题WA了60发,数组没开大,这OJ也不提示RE,光提示WA...... 思路:先求出最短路,如果删除的边不是最短路上的,那么对结果没有影响,要有影响,只能删除最短路上的边.所以枚举一下最短路上的 ...

  3. HDU-6290_奢侈的旅行(Dijstra+堆优化)

    奢侈的旅行 Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) Problem De ...

  4. hdu 2066 Dijstra 堆优化

    嗯 有广搜的意思 #include<cstdio> #include<iostream> #include<queue> #include<vector> ...

  5. 复习最短路 spfa+dijstra堆优化

    题目很简单,, 但是wa了三次,, 用<vector>之前一定要记得clear()...简单说下 spfa的问题 和bell_forman有点类似 每次取出一个点 然后更新 并把更新了的节 ...

  6. hdu3986Harry Potter and the Final Battle

    给你一个无向图,然后找出当中的最短路, 除去最短路中的随意一条边,看最糟糕的情况下, 新的图中,第一个点到末点的最短路长度是多少. 我的做法是: 首先找出最短路,然后记录路径, 再一条一条边的删, 删 ...

  7. 最短路-朴素版Dijkstra算法&堆优化版的Dijkstra

    朴素版Dijkstra 目标 找到从一个点到其他点的最短距离 思路 ①初始化距离dist数组,将起点dist距离设为0,其他点的距离设为无穷(就是很大的值) ②for循环遍历n次,每层循环里找出不在S ...

  8. hdu 3986(最短路变形好题)

    Harry Potter and the Final Battle Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/6553 ...

  9. 堆优化dijstra

    因为spfa没事就被卡一卡,所以堆优化dijstra就显得很重要,在最短路或者其模型里边,最少有一条边是没有被更新过的,也就是它是最短的,同理从这个点开始也有一条边最短,所以每次就找最短的然后松弛操作 ...

随机推荐

  1. P1664 每日打卡心情好

    题目背景 在洛谷中,打卡不只是一个简单的鼠标点击动作,通过每天在洛谷打卡,可以清晰地记录下自己在洛谷学习的足迹.通过每天打卡,来不断地暗示自己:我又在洛谷学习了一天,进而帮助自己培养恒心.耐心.细心. ...

  2. 【转】JobScheduler

    JobScheduler JobScheduler是Android L(API21)新增的特性,用于定义满足某些条件下执行的任务.它的宗旨是把一些不是特别紧急的任务放到更合适的时机批量处理,这样可以有 ...

  3. SIRI课程表

    wen 周一@0@{今天没课哦}周一 周二今天共一节课 第2节,可编程控制器应用,11号教学楼1 0 3房间 周二 周三今天共三节课 第二节,过程控制系统,2号楼2 1 0房间,第三节机械制造技术11 ...

  4. anzhuaggeoip

    1.因启动geoip模块,需要先安装GeoIP # wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz # tar xv ...

  5. 在windows上安装Jenkins---tomcat流

    在windows上安装Jenkins有两种方式: (1)jar流 在命令行中运行:java -jar jenkins.war 浏览器访问 localhost:8080,创建初始管理员帐号即可. (2) ...

  6. log4j 日志分级处理

    log4j 配置文件: log4j.rootLogger=debug,stdout,debug,info,errorlog4j.appender.stdout=org.apache.log4j.Con ...

  7. Java实现Web页面前数字字母验证码实现

    最近公司做项目开发中用到了验证码实现功能,将实现代码分享出来, 前段页面实现代码: 为了表达清晰,样式部分代码去掉了,大家根据自己的需求,自己添加样式. 页面JS代码:触发变动验证码改变的JS 后台 ...

  8. zabbix设置发送消息的时间

    需求:比如我有两个报警的媒介:邮件和微信,但是下班之后,晚上我不希望手机一直响,打扰我睡觉,邮件无所谓,可以24h发送 分析:那现在就需要把微信分时间段发送:比如06:00-24:00   这个时间点 ...

  9. vueCode 常用代码总结 20190116

    <template>props 传参<in-body :mbx="['首页','','']"> props 代码使用<BreadcrumbItem&g ...

  10. function语句注意事项

    function语句 在Javascript中定义一个函数,有两种写法: function foo() { } 和 var foo = function () { } 两种写法完全等价.但是在解析的时 ...