题意:给出几个集合,每个集合中有Si个点 且任意两个点的距离为ti,现在要求两个人分别从1和n出发,问最短多长时间才能遇到,且给出这些可能的相遇点;

取两个人到达某点时所用时间大的值 然后取最小的  若有多个结果 则按点的升序排列

解析:

比较裸的最短路 ,但坑在建图上,Si的和小于1e6  那么建的边肯定会超内存  所以压缩一下,把每个集合看作一个点  集合中的点到集合的距离为0  集合到集合中的点的距离为ti   即入为0 出为ti    然后普通最短路求就好了

spfa:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <queue>
  5. #include <cmath>
  6. #include <algorithm>
  7. #define mem(a,b) memset(a,b,sizeof(a))
  8. using namespace std;
  9. const int maxn = , INF = 0xfffffff;
  10. typedef long long LL;
  11. int n,m;
  12. int d[maxn], head[maxn], vis[maxn],tran1[maxn], tran2[maxn];
  13. struct time{
  14. int sum,ix;
  15. }Time[maxn];
  16.  
  17. int cmp(time a,time b)
  18. {
  19. if(a.sum == b.sum) return a.ix < b.ix;
  20. return a.sum < b.sum;
  21. }
  22.  
  23. struct node{
  24. int u,v,w,next;
  25. }Node[maxn];
  26.  
  27. void add(int u,int v,int w,int i)
  28. {
  29. Node[i].u = u;
  30. Node[i].v = v;
  31. Node[i].w = w;
  32. Node[i].next = head[u];
  33. head[u] = i;
  34. }
  35.  
  36. void spfa(int s)
  37. {
  38. queue<int> Q;
  39. fill(d,d+maxn,INF);
  40. mem(vis,);
  41. d[s] = ;
  42. Q.push(s);
  43. vis[s] = ;
  44. while(!Q.empty())
  45. {
  46. int u = Q.front();Q.pop();
  47. vis[u] = ;
  48. for(int i=head[u]; i!=-; i=Node[i].next)
  49. {
  50. node e = Node[i];
  51. if(d[e.v] > d[u] + e.w)
  52. {
  53. d[e.v] = d[u] + e.w;
  54. if(!vis[e.v])
  55. {
  56. Q.push(e.v);
  57. vis[e.v] = ;
  58. }
  59. }
  60. }
  61. }
  62. }
  63. int main()
  64. {
  65. int T;
  66. int temp = ;
  67. scanf("%d",&T);
  68. while(T--)
  69. {
  70. mem(head,-);
  71. mem(tran1,);
  72. mem(tran2,);
  73. mem(Time,);
  74. int ans = ;
  75. scanf("%d%d",&n,&m);
  76. for(int i=;i<=m;i++)
  77. {
  78. int t,h,tmp;
  79. scanf("%d%d",&t,&h);
  80. while(h--)
  81. {
  82. scanf("%d",&tmp);
  83. add(tmp,n+i,,ans++);
  84. add(n+i,tmp,t,ans++);
  85. }
  86. }
  87. spfa();
  88. for(int i=;i<=n;i++)
  89. tran1[i] = d[i];
  90. spfa(n);
  91. for(int i=;i<=n;i++)
  92. tran2[i] = d[i];
  93. for(int i=;i<n;i++)
  94. {
  95. Time[i].sum = max(tran1[i+],tran2[i+]);
  96. Time[i].ix = i+;
  97. }
  98. sort(Time,Time+n,cmp);
  99. LL res = Time[].sum;
  100. printf("Case #%d: ",++temp);
  101. if(res == INF)
  102. {
  103. printf("Evil John\n");
  104. continue;
  105. }
  106. printf("%I64d\n",res);
  107. for(int i=;i<n;i++)
  108. {
  109. if(res == Time[i].sum)
  110. {
  111. if(i > ) printf(" ");
  112. printf("%d",Time[i].ix);
  113. }
  114. else
  115. break;
  116. }
  117. printf("\n");
  118. }
  119.  
  120. return ;
  121. }

hdu5521(Meeting)spfa 层次网络最短路的更多相关文章

  1. HDU5521 Meeting(dijkstra+巧妙建图)

    HDU5521 Meeting 题意: 给你n个点,它们组成了m个团,第i个团内有si个点,且每个团内的点互相之间距离为ti,问如果同时从点1和点n出发,最短耗时多少相遇 很明显题目给出的是个无负环的 ...

  2. Spfa(最短路求解)

    spfa(最短路求解) 模板: #include<iostream> #include<cstdio> #include<queue> #include<cs ...

  3. 基于bellman-ford算法使用队列优化的spfa求最短路O(m),最坏O(n*m)

    acwing851-spfa求最短路 #include<iostream> #include<cstring> #include<algorithm> #inclu ...

  4. ACM - 最短路 - AcWing 851 spfa求最短路

    AcWing 851 spfa求最短路 题解 以此题为例介绍一下图论中的最短路算法 \(Bellman\)-\(Ford\) 算法.算法的步骤和正确性证明参考文章最短路径(Bellman-Ford算法 ...

  5. hdu-5521 Meeting(最短路)

    题目链接: Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  6. HDU5521 Meeting 题解 最短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521 题目大意: 有 \(n\) 个点 \(m\) 个集合,一个点可能处于若干个集合内,属于第 \(i ...

  7. [hdu5521 Meeting]最短路

    题意:有N个点,给定M个集合,集合Si里面的点两两之间的距离都为Ti,集合里面的所有点数之和<=1e6.有两个人分别在1和N处,求1个点使得两个人到这一点距离的最大值最小 思路:这题是裸的最短路 ...

  8. 【SPFA】 最短路计数

    最短路计数 [问题描述]   给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式]   输入第一行包含2个正整数N,M,为图的顶点数与边数. ...

  9. NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序

    原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...

随机推荐

  1. linux笔记-多服务器同时执行相同命令

    1.服务器的ip地址写到文件中,命名为nodelist.txt 192.168.1.160 192.168.1.166 2.编写运行脚本 for i in `cat nodelist.txt`do s ...

  2. jdk1.8安装后查看Java -version出错。

    最近在电脑行安装了多个jdk的版本 分别是jdk1.6,jdk1.7,jdk1.8三个版本,在配置环境变量的时候,选择的是jdk1.7; 但是奇怪的是,当我在cmd中输入java -version后, ...

  3. 02-Centos7安装部署Mirrorgate

    1.以Docker方式运行 MirrorGate服务器作为docker镜像提供,因此要运行它只需在终端中执行以下命令: 注意mongo镜像要使用3.6版本,其他版本会提示版本问题. #Spinup m ...

  4. LOJ2687 BOI2013 Vim 线头DP

    传送门 多图警告!!! 一种很新奇的\(DP\),全网似乎只有一两篇题解-- 首先,序列中的一段\(e\)等价于在跳的过程中这一段\(e\)之后的一个字符必须要经过,并且在最后的答案中加上$2 \ti ...

  5. Luogu3524 POI2011 Party 图论、构造

    题目传送门:https://www.luogu.org/problemnew/show/P3524 大意:给一个$N$个点的图,其中一定有一个大小为$\frac{2}{3}N$的团,程序需给出一个大小 ...

  6. 把一个List<T>的数据复制至另一个List<T>

    把一个数据集List<T>复制至到另一个数据集List<T>. 方法一,可以使用循环,然后把每一个T添加至另一个集合中去: public void ListDemo() { , ...

  7. vue 动态创建组件(运行时创建组件)

    function mountCmp (cmp, props, parent) { if (cmp.default) { cmp = cmp.default } cmp = Vue.extend(cmp ...

  8. kafka学习2:kafka集群安装与配置

    在前一篇:kafka学习1:kafka安装 中,我们安装了单机版的Kafka,而在实际应用中,不可能是单机版的应用,必定是以集群的方式出现.本篇介绍Kafka集群的安装过程: 一.准备工作 1.开通Z ...

  9. Verilog设计Valid-Ready握手协议

    转自http://ninghechuan.com 我不生产知识,我只是知识的搬运工. Handshake Protocol握手协议!为了保证数据传输过程中准确无误,我们需要加上握手信号来控制信号的传输 ...

  10. Mvc4_ @RenderBody、@RenderPage、@RenderSection用法

    一.@RenderBody 当创建基于_Layout.cshtml布局页面的视图时,视图的内容会和布局页面合并,而新创建视图的内容会通过_Layout.cshtml布局页面的@RenderBody() ...