题目链接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了。

代码实现:
 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e18;
const int N = ;
const int M = ;
struct edge {
int to;
ll cost;
edge(int _to, ll _cost):to(_to),cost(_cost){}
};
typedef pair<ll, int> P;// first是最短距离,second是顶点的编号
int V;
vector<edge>G[N];
ll d[][N];//点1 和 点n 到达其他点的最短时间
void dij(int id, int s) {
priority_queue<P, vector<P>, greater<P> > que;
for(int i = ; i <= V; ++i) d[id][i] = INF;
d[id][s] = ;
que.push(P(, s)); while(!que.empty()) {
P p = que.top(); que.pop();
int v = p.second;
if(d[id][v] < p.first) continue;
int num = G[v].size();
for(int i = ; i < num; ++i) {
edge e = G[v][i];
if(d[id][e.to] > d[id][v] + e.cost) {
d[id][e.to] = d[id][v] + e.cost;
que.push(P(d[id][e.to], e.to));
}
}
}
}
int main() {
int k, T, t, n, m, i, s, x, u, v;
scanf("%d", &T);
for(k = ; k <= T; ++k) {
for(i = ; i < N; ++i) G[i].clear();
scanf("%d%d", &n, &m);//点数,集合(完全图)数目
for(i = ; i <= *m; i += ) {
u = n+i;//入点
v = n+i+;//出点
scanf("%d%d", &t, &s);//时间,集合中点数
while(s--) {
scanf("%d", &x);
G[u].push_back(edge(x, ));
G[x].push_back(edge(v, ));
}
G[v].push_back(edge(u, t));
}
V = n+*m;
dij(, );
dij(, n);
/*
puts("-----------------");
for(i = 1; i <= n; ++i) {
printf("%lld, %lld\n", d[0][i], d[1][i]);
}
puts("-----------------");
*/
ll mi = INF;
int cnt = ;
ll a = ;
for(i = ; i <= n; ++i) {
if((a = max(d[][i], d[][i])) < mi) {
mi = a;
}
}
printf("Case #%d: ", k);
if(mi == INF) {
printf("Evil John\n");
}
else {
int f = ;
printf("%lld\n", mi);
for(i = ; i <= n; ++i) {
a = max(d[][i], d[][i]);
if(a == mi) {
if(f) putchar(' ');
printf("%d", i);
f = ;
}
}
puts("");
}
}
return ;
}

2667ms

hdu 5521 Meeting(最短路)的更多相关文章

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

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

  2. HDU 5521 Meeting(虚拟节点+最短路)

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

  3. HDU 5521 Meeting【最短路】

    今天旁观了Angry_Newbie的模拟区域赛(2015shenyang) 倒着看最先看的M题,很明显的最短路问题,在我看懂的时候他们已经开始敲B了. 后来听说D过了很多人.. D题一看是个博弈,给了 ...

  4. HDU 5521 Meeting (最短路,dijstra)

    题意:有N个点,两个人,其中一个人住在点1,另一个人住在点n,有M个点集,集合内的数表示任意两点的距离为dis ,现在问,如果两个人要见面, 需要最短距离是多少,有哪几个点能被当成见面点. 析:分别对 ...

  5. HDU 5521 [图论][最短路][建图灵感]

    /* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...

  6. HDU 5521 Meeting

    2015 ACM / ICPC 沈阳站现场赛 M题 最短路 设置N+M个节点,前N个节点是Block,后M个节点是Set,每一组Set中的点向该Set连边,从1和n开始分别求最短路.注意爆int. # ...

  7. HDU - 5521 Meeting (Dijkstra)

    思路: 看了好久才看懂题意,文中给了n个点,有m个集合,每个集合有s个点,集合内的每两个点之间有一个权值为t的边,现在有两个人,要从1号点,和n号点,走到同一个顶点,问最少花费以及花费最少的点. 那就 ...

  8. HDU 5521:Meeting(最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=5521 Meeting Problem Description   Bessie and her friend E ...

  9. hdu 5521 最短路

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

随机推荐

  1. Spring与SpringMVC的关系

    在此鉴于你已经了解过Spring的相关知识,简单描述一下Spring与Spring的关系 在框架的使用中,Spring类似于一个具有多种特性,也可以说是多种功能模块的应用平台,(特性就比如IoC,AO ...

  2. R 语言贷款月供数据分析

    #================================================================ #--------------------------------- ...

  3. 判定 java 对象死亡的过程

  4. 理解ResourceBundle.getBundle("dataSourceFactory")

    最近在项目文件中看到这样的代码一下子还看不懂 经过他人指点和自己百度,总算明白大致用处. 首先这个方法时java.util的内置方法,主要功能是用于解析properties文件的. ResourceB ...

  5. 关于this的全面解析(call,apply,new)

    我们在写代码的时候,时常会被this弄的傻傻分不清楚,看源码的时候也经常被call啊apply啊弄的头皮发麻.this到底是什么?本文主要根据书上和实际应用做了一些归纳.一般情况下this有4种绑定规 ...

  6. bootstrap学习笔记细化(标题)

    bootstrap中的排版: 标题(h1~h6/.h1~.h6) h1:36px;h2:30px;h3:24px;h4:18px;h5:14px;h6:12px; 副标题(small) 小练习(标题大 ...

  7. 使用laravel框架与phantomjs实现截屏功能

    在网上看到的关于phantomjs实现截屏功能很多都是与node结合在一起使用,并需要输入命令才能执行.因此我想要实现输入网址即可截屏并输出图片的功能.示例:http://120.77.171.182 ...

  8. mybatis 关联表心得

    1,例如订单表与用户表的关联,一个订单对应一个用户,这是一对一关联: 用代码实现是这样: A(用resultType去实现的话,如下) 1,使用到继承, OrderUser extend Order{ ...

  9. Conda常用命令整理

    主要参考Anaconda官方指南Using Conda:https://conda.io/docs/using/index.html 环境:Win10 64bit with conda 4.3.14  ...

  10. Reverse Integer 旋转数字

    Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 本地注意正负号判断 ...