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

思路:这题是裸的最短路问题,难点在建图。然而建图也只有1步,在集合外新建1个点,每个点向它连一条Ti/2的边(避免浮点数,可以先乘2,然后结果除以2)。如此巧妙。。。

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
#define all(a) (a).begin(), (a).end()
#define mset(a, x) memset(a, x, sizeof(a))
#define mcpy(a, b) memcpy(a, b, sizeof(b))
#define cas() int T, cas = 0; cin >> T; while (T --)
template<typename T>bool umax(T&a, const T&b){return a<b?(a=b,true):false;}
template<typename T>bool umin(T&a, const T&b){return b<a?(a=b,true):false;}
typedef long long ll;
typedef pair<int, int> pii; #ifndef ONLINE_JUDGE
#include "local.h"
#endif const int N = 1e6 + 7; struct Edge {
int u, v, w;
int next;
Edge(int u, int v, int w) {
this->u = u;
this->v = v;
this->w = w;
}
Edge() {}
};
int SZ;
int head[N];
Edge edge[N << 1];
ll d1[N], dn[N];
int n, m, nn;
bool used[N]; void add(int u, int v, int w) {
edge[SZ] = Edge(u, v, w);
edge[SZ].next = head[u];
head[u] = SZ ++;
} void spfa(int s, ll d[]) {
queue<int> Q;
for (int i = 1; i <= nn; i ++) d[i] = pow(10, 18) + 7;
d[s] = 0;
mset(used, 0);
Q.push(s);
while (!Q.empty()) {
int u = Q.front(); Q.pop();
used[u] = false;
for (int i = head[u]; ~i; i = edge[i].next) {
Edge e = edge[i];
if (umin(d[e.v], d[u] + e.w)) {
if (!used[e.v]) {
Q.push(e.v);
used[e.v] = true;
}
}
}
}
} int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif // ONLINE_JUDGE
int t, s, u;
cas() {
printf("Case #%d: ", ++ cas);
cin >> n >> m;
nn = n;
mset(head, -1);
SZ = 0;
for (int i = 0; i < m; i ++) {
scanf("%d%d", &t, &s);
nn ++;
for (int j = 0; j < s; j ++) {
scanf("%d", &u);
add(u, nn, t);
add(nn, u, t);
}
}
spfa(1, d1);
spfa(n, dn);
ll mind = pow(10, 18);
bool yes = false;
vector<int> ans;
for (int i = 1; i <= n; i ++) {
if (umin(mind, max(d1[i], dn[i]))) yes = true;
}
if (!yes) {
puts("Evil John");
continue;
}
cout << mind / 2 << endl;
for (int i = 1; i <= n; i ++) {
if (max(d1[i], dn[i]) == mind) {
ans.pb(i);
}
}
sort(all(ans));
for (int i = 0; i < ans.size(); i ++) {
printf("%d%c", ans[i], i == ans.size() - 1? '\n' : ' ');
}
}
return 0;
}

  

[hdu5521 Meeting]最短路的更多相关文章

  1. hdu-5521 Meeting(最短路)

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

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

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

  3. hdu5521(Meeting)spfa 层次网络最短路

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

  4. HDU5521 Meeting 题解 最短路

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

  5. HDU 5521.Meeting 最短路模板题

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

  6. hdu5521 Meeting

    传送门 题目 Bessie and her friend Elsie decide to have a meeting. However, after Farmer John decorated hi ...

  7. 2015沈阳区域赛Meeting(最短路 + 建图)

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

  8. ACM学习历程—HDU5521 Meeting(图论)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521 学习菊苣的博客,只粘链接,不粘题目描述了. 题目大意就是一个人从1开始走,一个人从n开始走.让最 ...

  9. 2015沈阳站-Meeting 最短路

    http://acm.hdu.edu.cn/showproblem.php?pid=5521 题目大意:A,B两个人分别在1和n区.给出区之间有联系的图以及到达所需时间.求两个人见面最短时间以及在哪个 ...

随机推荐

  1. 高校战“疫”网络安全分享赛 Misc ez_mem&usb

    打开之后是一个流量包 用wireshark导出HTTP文件,有个upload,用一下binwalk,出来了一个镜像文件 用volatility搜一下,命令里有一个密码,看见了但是后来给忘了... 文件 ...

  2. radio样式

    .radio{ position: relative; border: 1px solid #999; border-radius: 50%; width: 12px; height: 12px; b ...

  3. Python开发基础之Python常用的数据类型

    一.Python介绍 Python是一种动态解释型的编程语言.Python它简单易学.功能强大.支持面向对象.函数式编程,可以在Windows.Linux等多种操作系统上使用,同时Python可以在J ...

  4. 干货福利:如何使用Python中Django模板?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 穆胜亮 篇文章将学习如何使用Django模板.模板是在Django ...

  5. linux php 安装 openssl扩展

    (1.生成 openssl.so 文件)#进入扩展目录cd /data/soft/php-5.5.38/ext/openssl#生成 configure 文件/usr/local/php/bin/ph ...

  6. docker的网络(5)

    当 Docker 启动时,会自动在宿主机上创建一个 docker0 虚拟网桥,实际上是Linux 的一个 bridge. Docker 随机分配一个本地未占用的私有网络(在RFC1918中定义)中的一 ...

  7. (c++ std) 查找 vector 中的元素

    You can use std::find from <algorithm>: std::find(vector.begin(), vector.end(), item) != vecto ...

  8. POJ3460 Booksort

    飞来山上千寻塔,闻说鸡鸣见日升. 不畏浮云遮望眼,自缘身在最高层.--王安石 题目:Booksort 网址:http://poj.org/problem?id=3460 Description The ...

  9. 【linux三剑客】grep命令

    grep, egrep, fgrep - print lines matching a pattern grep 命令用于查找文件里符合条件的字符串. grep 指令用于查找内容包含指定的范本样式的文 ...

  10. 什么是最好的在线UML软件工具?

    在线UML软件工具允许您创建UML图表,而UML绘图工具可帮助维护您的建模工件并促进不同图表中元素的可重用性.一些UML建模工具还提供复杂的建模功能,例如模型转换,报告,代码工程等. 如果您正在寻找U ...