【HDOJ5521】Meeting(最短路)
题意:有n个点,m个点集,每个点集中有e[i]个点,同一点集的点互相之间到达需要t[i]单位的时间,求min(max(dis(1,i),dis(i,n))),i属于[1,n]
输出最小值并増序输出所有使答案取到最小值的i,无解输出Evil John
n<=1e5,1<=t[i]<=1e9,sigma e[i]<=1e6
思路:出烂了的裂点最短路
对于每个点集另外裂一个点id,设该点集中的点为a[i]
a[i]——>id 长度为t[i]
id——>a[i] 长度为0
以1和n为起点跑两遍dijkstra+堆
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 1200000
#define M 2200000
#define MOD 1000000007
#define eps 1e-8
#define pi acos(-1)
#define oo 1ll<<60
priority_queue<pair<ll,int> > q; ll dis1[N],dis2[N];
int head[N],vet[M],len[M],nxt[M],vis[N],c[N],id,tot; int add(int a,int b,int c)
{
//printf("%d %d %d\n",a,b,c);
nxt[++tot]=head[a];
vet[tot]=b;
len[tot]=c;
head[a]=tot;
} ll min(ll x,ll y)
{
if(x<y) return x;
return y;
} ll max(ll x,ll y)
{
if(x>y) return x;
return y;
} int main()
{
freopen("M.in","r",stdin);
freopen("M.out","w",stdout);
int cas;
scanf("%d",&cas);
for(int t=;t<=cas;t++)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=id;i++) head[i]=dis1[i]=dis2[i]=;
tot=;
id=n;
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
id++;
for(int j=;j<=y;j++)
{
int z;
scanf("%d",&z);
add(z,id,x);
add(id,z,);
}
}
for(int i=;i<=id;i++)
{
vis[i]=;
dis1[i]=oo;
}
//for(int i=1;i<=id;i++) printf("%d %lld\n",i,dis1[i]);
q.push(MP(,)); dis1[]=;
while(!q.empty())
{
int u=q.top().se;
q.pop();
if(vis[u]) continue;
vis[u]=;
int e=head[u];
while(e)
{
int v=vet[e];
if(dis1[u]+len[e]<dis1[v])
{
dis1[v]=dis1[u]+len[e];
q.push(MP(-dis1[v],v));
}
e=nxt[e];
}
} for(int i=;i<=id;i++)
{
vis[i]=;
dis2[i]=oo;
}
q.push(MP(,n)); dis2[n]=;
while(!q.empty())
{
int u=q.top().se;
q.pop();
if(vis[u]) continue;
vis[u]=;
int e=head[u];
while(e)
{
int v=vet[e];
if(dis2[u]+len[e]<dis2[v])
{
dis2[v]=dis2[u]+len[e];
q.push(MP(-dis2[v],v));
}
e=nxt[e];
}
}
//for(int i=1;i<=id;i++) printf("%d %lld %lld\n",i,dis1[i],dis2[i]);
ll mn=oo;
for(int i=;i<=n;i++) mn=min(mn,max(dis1[i],dis2[i]));
// printf("mn=%lld\n",mn);
printf("Case #%d: ",t);
if(mn==oo) printf("Evil John\n");
else
{
int ans=;
for(int i=;i<=n;i++)
if(max(dis1[i],dis2[i])==mn) c[++ans]=i;
printf("%lld\n",mn);
for(int i=;i<=ans-;i++) printf("%d ",c[i]);
printf("%d\n",c[ans]);
}
}
return ;
}
【HDOJ5521】Meeting(最短路)的更多相关文章
- [HDOJ5521]Meeting(最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521 给n个点,m个块.块内点到点之间话费的时间ti.两个人分别从点1和点n出发,问两人是否可以相遇, ...
- hdu-5521 Meeting(最短路)
题目链接: Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) ...
- HDU 5521.Meeting 最短路模板题
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- 2015沈阳区域赛Meeting(最短路 + 建图)
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- 2015沈阳站-Meeting 最短路
http://acm.hdu.edu.cn/showproblem.php?pid=5521 题目大意:A,B两个人分别在1和n区.给出区之间有联系的图以及到达所需时间.求两个人见面最短时间以及在哪个 ...
- [hdu5521 Meeting]最短路
题意:有N个点,给定M个集合,集合Si里面的点两两之间的距离都为Ti,集合里面的所有点数之和<=1e6.有两个人分别在1和N处,求1个点使得两个人到这一点距离的最大值最小 思路:这题是裸的最短路 ...
- HDU 5521 Meeting(虚拟节点+最短路)
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total ...
- URAL 1085 Meeting(最短路)
Meeting Time limit: 2.0 secondMemory limit: 64 MB K friends has decided to meet in order to celebrat ...
- HDU 5521:Meeting(最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=5521 Meeting Problem Description Bessie and her friend E ...
随机推荐
- 微信小程序js学习心得体会
微信小程序js学习心得体会 页面控制的bindtap和catchtap 用法,区别 <button id='123' data-userDate='100' bindtap='tabMessag ...
- Fakeapp 入门教程(3):参数篇
参数可以让软件自由度更高.Fakeapp的参数并不算多,但是也非常使用.本文就讲解下几个重要的参数.参数设置界面可以通过点击SETTINGS打开. 参数修改无需点击保存,一旦修改直接生效. Proce ...
- INNODB insert query end state
innodb_flush_log_at_trx_commit=2 innodb_flush_method=O_DIRECT (for non-windows machine) innodb_buffe ...
- GoF23种设计模式之创建型模式之工厂方法模式
一.概述 定义一个用于创建对象的接口,让子类去决定实例化哪个类.工厂方法将一个类的实例化延迟至其子类. 二.适用性 1.当一个类不知道它所必须创建的对象的类的时候. 2.当一个类希望由其子类来指定它所 ...
- python学习笔记(四):生成器、内置函数、json
一.生成器 生成器是什么?其实和list差不多,只不过list生成的时候数据已经在内存里面了,而生成器中生成的数据是当被调用时才生成呢,这样就节省了内存空间. 1. 列表生成式,在第二篇博客里面我写了 ...
- 51nod_1154 回文串的划分
说实话..最开始看这题感觉一定好难...好高大上...我的马拉车还不熟....这种..但是本着做不出来也要至少看看的心态,吧个题看完了..然后简单的想了想,好像是个挺直观的动态规划,因为看到数据几乎就 ...
- volatile、synchronized、lock有什么区别,以及在哪些场景下使用哪种方式?
[转]JVM锁机制volatile/synchronized/lock 1.volatile实现原理 (1)聊聊并发(一)——深入分析Volatile的实现原理 --硬件级别锁实现,Lock前缀指令会 ...
- easyui的tree基本属性
1.cascadeCheck,级联 默认情况下,是true,级联的,就是选中一个子节点,父节点是半选中状态,子节点全选中之后,父节点就是选中状态.
- jmeter非GUI模式如何压测并生成测试报告
在启动Jmeter时,我们会看到这样一句提示: 不要使用GUI模式(界面模式)进行负载测试,GUI模式只能用于创建测试和调试.进行负载测试时,需要时用非GUI模式. 那么为什么进行负载测试时一定要用非 ...
- linux/mac下的配置自定义命令alias
linux/mac下的自定义命令alias,并保存别名使其永久生效(重启不会失效) 在做开发每次提交代码的命令都是一长串参数,不想去记,于是可以使用alias命令来解决这个问题:alias aComm ...