题目链接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. 使用FileSystemWatcher监视指定目录

    使用 FileSystemWatcher 监视指定目录中的更改.可监视指定目录中的文件或子目录的更改. 以下是一个简单的实例,用来监控指定目录下文件的新增.删除.重命名等情况(文件内容更改会触发多次, ...

  2. 解决Genymotion下载device时较慢的问题

    Genymotion添加device时,加载速度很慢: 简单方法处理如下: 1.首先找到如下目录文件名 打开后找到如下行,复制该地址直接使用迅雷等下载工具下载好该ova文件: 2.放置下载好的文件至对 ...

  3. redis中的发布订阅(Pub/Sub)

    这里使用nodejs的redis模块说明,具体可见https://www.npmjs.com/package/redis,先来通过一个简单的例子了解下redis中的Pub/Sub具体怎么实现吧.. v ...

  4. Linux多进程之间的文件锁

    之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操作.故想到了文件锁. Linux下可以使用flock()函数对文件进行加锁解锁等操作.简单介绍下flock()函数: 表头 ...

  5. ASP.NET页面支持的指令

    页面的处理指令 页面指令的处理用于配置执行该页面的运行时环境.在ASP.NET中,指令可以位于页面的任何位置,但良好且常见的习惯是将其置于文件的开始部分.除此,页面指令的名称是不区分大小写的,且指令的 ...

  6. poj 1088(DP+递归)

    这题状态方程很容易得到:DP[i][j] = max(DP[i-1][j],DP[i+1][j],DP[i][j-1],DP[i][j+1]) + 1 难点在于边界条件和剪枝,因为这方程的条件是点在m ...

  7. OpenStack IceHouse 部署 - 3 - 控制节点部署

    Mysql部署配置  安装 安装mysql,mysql的python绑定 apt-get install mysql-server 安装过程中会要求设定mysql的root账户的密码,这里假定设为my ...

  8. KDTree(Bzoj2648: SJY摆棋子)

    题面 传送门 KDTree 大概就是一个分割\(k\)维空间的数据结构,二叉树 建立:每层选取一维为关键字,把中间的点拿出来,递归左右,有个\(STL\)函数nth_element可以用一下 维护:维 ...

  9. 用java访问Oracle数据库、取得记录并输出到界面

    Class.forName(“oracle.jdbc.driver.OracleDriver”);Connection conn=DriverManager.getConnection( url , ...

  10. MUI框架-13-使用百度地图 API(图文教程)

    MUI框架-13-使用百度地图 API(图文教程) 后面有实例,转载请注明出处 一.申请百度地图权限 1.打开 百度地图开放平台:http://lbsyun.baidu.com/apiconsole/ ...