hdu 5521 Meeting(最短路)
题目链接: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(最短路)的更多相关文章
- HDU 5521.Meeting 最短路模板题
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- HDU 5521 Meeting(虚拟节点+最短路)
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total ...
- HDU 5521 Meeting【最短路】
今天旁观了Angry_Newbie的模拟区域赛(2015shenyang) 倒着看最先看的M题,很明显的最短路问题,在我看懂的时候他们已经开始敲B了. 后来听说D过了很多人.. D题一看是个博弈,给了 ...
- HDU 5521 Meeting (最短路,dijstra)
题意:有N个点,两个人,其中一个人住在点1,另一个人住在点n,有M个点集,集合内的数表示任意两点的距离为dis ,现在问,如果两个人要见面, 需要最短距离是多少,有哪几个点能被当成见面点. 析:分别对 ...
- HDU 5521 [图论][最短路][建图灵感]
/* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...
- HDU 5521 Meeting
2015 ACM / ICPC 沈阳站现场赛 M题 最短路 设置N+M个节点,前N个节点是Block,后M个节点是Set,每一组Set中的点向该Set连边,从1和n开始分别求最短路.注意爆int. # ...
- HDU - 5521 Meeting (Dijkstra)
思路: 看了好久才看懂题意,文中给了n个点,有m个集合,每个集合有s个点,集合内的每两个点之间有一个权值为t的边,现在有两个人,要从1号点,和n号点,走到同一个顶点,问最少花费以及花费最少的点. 那就 ...
- HDU 5521:Meeting(最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=5521 Meeting Problem Description Bessie and her friend E ...
- hdu 5521 最短路
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
随机推荐
- php中类和对象的操作
在类中用$this指代对象本身. 用self::指代类本身. $p1 = new Person('michael');//向Person类的构造函数__construct中传名字 echo($p1-& ...
- js控制表格隔行变色
只是加载时候隔行变一个颜色,鼠标滑动上去时候没有变化 <table width="800" border="0" cellpadding="0& ...
- 获取用户Ip地址通用方法
1 public static function getIp() 2 { 3 if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]) 4 { ...
- redis的默认配置文件redis.conf详解
# redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 bytes # 1kb ...
- 自定义Jquery插件——由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件
由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件下面是代码: // 掉用方式支持 $('select').textBeauty(1 ...
- Foxmail邮件收取网易企业邮件配置
- 51nod1538:一道难题(常系数线性递推/Cayley-Hamilton定理)
传送门 Sol 考虑要求的东西的组合意义,问题转化为: 有 \(n\) 种小球,每种的大小为 \(a_i\),求选出大小总和为 \(m\) 的小球排成一排的排列数 有递推 \(f_i=\sum_{j= ...
- Maven学习总结(一):基本概念
一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1. ...
- Oracle 给字符串补空格、补0
利用lpad().RPAD()函数来实现给字符串补空格或补0的功能: 一.lpad()lpad函数将左边的字符串填充一些特定的字符其语法格式如下:lpad(string,n,[pad_string]) ...
- shrio的知识储备
博客讲解; shrio的知识储备 shrio的简单认识 笔记整理地址: Shrio.pdf 下载 Shrio理论.doc 下载 Shrio知识储备.doc 下载 Shrio的知识储备 (一) S ...