博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[hdu5521 Meeting]最短路
阅读量:5296 次
发布时间:2019-06-14

本文共 2328 字,大约阅读时间需要 7 分钟。

 

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

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

#include 
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
bool umax(T&a, const T&b){return a
bool umin(T&a, const T&b){return b
pii;#ifndef ONLINE_JUDGE #include "local.h"#endifconst 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
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
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;}

  

转载于:https://www.cnblogs.com/jklongint/p/4926268.html

你可能感兴趣的文章
【转】redo与undo
查看>>
C#更新程序设计
查看>>
解决升级系统导致的 curl: (48) An unknown option was passed in to libcurl
查看>>
Java Session 介绍;
查看>>
spoj TBATTLE 质因数分解+二分
查看>>
Django 模型层
查看>>
dedecms讲解-arc.listview.class.php分析,列表页展示
查看>>
Extjs6 经典版 combo下拉框数据的使用及动态传参
查看>>
【NodeJS】http-server.cmd
查看>>
研磨JavaScript系列(五):奇妙的对象
查看>>
面试题2
查看>>
selenium+java iframe定位
查看>>
P2P综述
查看>>
第五章 如何使用Burp Target
查看>>
Sprint阶段测试评分总结
查看>>
sqlite3经常使用命令&amp;语法
查看>>
linux下编译openjdk8
查看>>
【python】--迭代器生成器装饰器
查看>>
Pow(x, n)
查看>>
安卓当中的线程和每秒刷一次
查看>>