题意:有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. E - Travel by Car

    连接https://atcoder.jp/contests/abc143/tasks/abc143_e 题目大意: 在一个无向图中,当前的油量为L,给出q个问题,判断从a到b需要多少加几次油,路上每个 ...

  2. java文件上传、下载、图片预览

    多文件保存到本地: @ResponseBody    @RequestMapping(value = "/uploadApp",produces = { "applica ...

  3. CVE-2019-1388:Windows UAC 本地提权复现

    0x01 简介 用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制.其原理是通知用户是否对应用程序使用 ...

  4. selemiun 下拉菜单、复选框、弹框定位识别

    一.下拉菜单识别 对下拉框的操作,主要是通过Select 类里面的方法来实现的,所以需要new 一个Select 对象(org.openqa.selenium.support.ui.Select)来进 ...

  5. curl book

    curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 官方地址 man page 下载页面, ...

  6. C#客户端打印条形码

    第一种方法: 引用第三方插件文件zxing.dll // 1.设置条形码规格 EncodingOptions encodeOption = new EncodingOptions(); encodeO ...

  7. js 一个或多个一维数组,算出元素之间相互组合的所有情况

    // 数据源 var target = { state1: ['1', '2'], state2: ['01', '02', '03'], state3: ['001','002'] } stackS ...

  8. Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!

    目录 前言 PostgreSql VS MySql HikariCP VS Druid Swagger2 自定义参数配置一览 结语 前言   最近几天又抽时间给代码生成器增加了几个新功能(预计今晚发布 ...

  9. Testing for the End of a File (Windows 的异步 IO)

    The ReadFile function checks for the end-of-file condition (EOF) differently for synchronous and asy ...

  10. 双链表【参照redis链表结构】

    参照了Redis里面的双链表结构,可以说是完全复制粘贴,redis的双链表还是写的很通俗易懂的,没有什么花里胡哨的东西,但是redis还有个iter迭代器的结构来遍历链表.我这里就没有实现了,只是实现 ...