题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521

题意:有1-n共n个点,给出m个块(完全图),并知道块内各点之间互相到达花费时间均为ti。已知两人分别在点1和点n,求在哪些点相遇能使得花费时间最短。题解:显然先想到从点1和点n分别求最短路,然后枚举点找出哪些点是相遇花费时间最少的。但是这题边太多了,假设一个完全图里有x个点,那边就有x*(x-1)/2条了,必须化简其边。一个可行的办法是给每个完全图增加两个点,分别为入点和出点,入点向其中的点连边,其中的点再向出点连边,权均为0,出点向入点连边,权为ti,边数就化简为2*x了。代码实现:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const ll INF = 1e18;
 5 const int N = 2100010;
 6 const int M = 2100010;
 7 struct edge {
 8     int to;
 9     ll cost;
10     edge(int _to, ll _cost):to(_to),cost(_cost){}
11 };
12 typedef pair<ll, int> P;// first是最短距离,second是顶点的编号
13 int V;
14 vector<edge>G[N];
15 ll d[2][N];//点1 和 点n 到达其他点的最短时间
16 void dij(int id, int s) {
17     priority_queue<P, vector<P>, greater<P> > que;
18     for(int i = 0; i <= V; ++i) d[id][i] = INF;
19     d[id][s] = 0;
20     que.push(P(0, s));
21
22     while(!que.empty()) {
23         P p = que.top(); que.pop();
24         int v = p.second;
25         if(d[id][v] < p.first) continue;
26         int num = G[v].size();
27         for(int i = 0; i < num; ++i) {
28             edge e = G[v][i];
29             if(d[id][e.to] > d[id][v] + e.cost) {
30                 d[id][e.to] = d[id][v] + e.cost;
31                 que.push(P(d[id][e.to], e.to));
32             }
33         }
34     }
35 }
36 int main() {
37     int k, T, t, n, m, i, s, x, u, v;
38     scanf("%d", &T);
39     for(k = 1; k <= T; ++k) {
40         for(i = 0; i < N; ++i) G[i].clear();
41         scanf("%d%d", &n, &m);//点数,集合(完全图)数目
42         for(i = 1; i <= 2*m; i += 2) {
43             u = n+i;//入点
44             v = n+i+1;//出点
45             scanf("%d%d", &t, &s);//时间,集合中点数
46             while(s--) {
47                 scanf("%d", &x);
48                 G[u].push_back(edge(x, 0));
49                 G[x].push_back(edge(v, 0));
50             }
51             G[v].push_back(edge(u, t));
52         }
53         V = n+2*m;
54         dij(0, 1);
55         dij(1, n);
56         /*
57         puts("-----------------");
58         for(i = 1; i <= n; ++i) {
59             printf("%lld, %lld\n", d[0][i], d[1][i]);
60         }
61         puts("-----------------");
62         */
63         ll mi = INF;
64         int cnt = 0;
65         ll a = 0;
66         for(i = 1; i <= n; ++i) {
67             if((a = max(d[0][i], d[1][i])) < mi) {
68                 mi = a;
69             }
70         }
71         printf("Case #%d: ", k);
72         if(mi == INF) {
73             printf("Evil John\n");
74         }
75         else {
76             int f = 0;
77             printf("%lld\n", mi);
78             for(i = 1; i <= n; ++i) {
79                 a = max(d[0][i], d[1][i]);
80                 if(a == mi) {
81                     if(f) putchar(' ');
82                     printf("%d", i);
83                     f = 1;
84                 }
85             }
86             puts("");
87         }
88     }
89     return 0;
90 }

2667ms

转载于:https://www.cnblogs.com/GraceSkyer/p/8723943.html

hdu 5521 Meeting(最短路)相关推荐

  1. HDU - 5521 Meeting(最短路+思维建边)

    题目链接:点击查看 题目大意:给出 n 个点,再给出 m 个集合,对于每个集合中的点来说,其两两都是相互可达的,且花费都相同,问有多少个点,到达点 1 和点 n 的距离相同且最小 题目分析:因为每个集 ...

  2. Meeting HDU - 5521

    Meeting HDU - 5521 题意: 一共有n个点,有m个块,每个块内有Si个点,块内点彼此到达费用为wi,两个人分别位于1和n号块,两者同时出发问最短时间遇到是多少?在哪些地方可以遇到? Σ ...

  3. HDOJ 2112 HDU Today (最短路 Dijkstra SPFA)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. hdu 4311 Meeting point-1

    http://acm.hdu.edu.cn/showproblem.php?pid=4311 思维呀 亲   你想到就可以做出来  想不到就做不出了 什么都不说了  上代码 不知道为什么 在hdu 上 ...

  5. hdu 3790(最短路)

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem D ...

  6. hdu 6852Path6(最短路+最小割)

    传送门 •题意 有n个城市,标号1-n 现花费最小的代价堵路 使得从1号城市到n号城市的路径边长 (注意只是变长不是最长) 堵一条路的代价是这条路的权值 •思路 在堵路以前,从1到n的最小路径当然是最 ...

  7. HDU - 6582 Path(最短路+最大流)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的有向图,现在问让最短路变长的最小花费是多少 题目分析:增加最短路的最小花费,我们可以将最短路上的边单独拿出来,再求一下最小割就好了,用 ...

  8. HDU - 5889 Barricade(最短路+最小割-最大流)

    题目链接:点击查看 题目大意:给出一张无向图,每条边的长度为1,第i条边建立障碍的花费为wi,题目要求在保证从1到n号点的所有的最短路径上,都有障碍的情况下的最小费用 题目分析:要求最短路上的最小割, ...

  9. HDU - 3571 HDU CakeMan(bfs+最短路必经点)

    题目链接:点击查看 题目大意:给出一个n*m的地图: 'D'表示小贩 'S'表示小贩的家 'C'表示城管 'X'表示墙 '.'表示路 '数字'表示小贩需要多停留几秒钟 现在城管发现了小贩,小贩会选择任 ...

最新文章

  1. IOS8 PUSH解决方法
  2. 蓝桥训练1-3,5-8题解(自己写的,过了蓝桥官网的数据)
  3. acer switch 10 linux,【AcerSwitch10评测】高颜值的2in1电脑 Acer Switch 10评测_Acer Switch 10_笔记本评测-中关村在线...
  4. localtunnel:本地端口的服务映射到公网
  5. SpringBoot2.0之五 优雅整合SpringBoot2.0+MyBatis+druid+PageHelper
  6. linux中sh和bash的区别
  7. string与StringBuilder 性能差距到底有多大
  8. VSCode下载安装和修改插件下载位置(配置右键菜单)
  9. python针对Excel表格的操作
  10. 10个Spring Boot 优秀学习项目
  11. 解决Setting property 'source' to 'org.eclipse.jst.jee.server的问题
  12. 泊松分酒 泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。
  13. python树状图可视化_如何可视化(树状图)一个层次项目字典?
  14. 2021年建5G基站60万个;中兴遭减持;三大运营商2020年成绩单;电信发布新手机...
  15. linux系统无法启动 备份恢复,Linux运维 第二阶段 (十四) 备份与恢复及常见故障排除...
  16. exphp框架,只为快速的开发
  17. 2017CSDN博客排名第一名,今何处?
  18. 项目文件模板-项目建议书
  19. matlab repmat(,matlab中 repmat([1:N]',[1,2]),p)什么意思?
  20. Cobalt Strike之CHM、LNK、HTA钓鱼

热门文章

  1. laravel5.5事件系统
  2. 理解sqlalchemy与ORM
  3. DP专辑之最长公共子序列及其变形
  4. git 远程分支创建与推送
  5. 成功移植mplayer到mini2440
  6. e2fsprogs制作嵌入式 mkfs.ext2 mkfs.ext3 mkfs.ext4
  7. urllib模块学习
  8. echarts怎么控制一个点沿着折线移动_计算机怎么识别图像中的直线?
  9. 简单约瑟夫环问题解法汇总(模拟/数论)
  10. pytorch 获取模型参数_锂电池P2D模型参数获取:平衡电势