【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 ...
随机推荐
- getchar输入多行字符,原格式输出(包含换行符)
#include<stdio.h> int main() { FILE fp; ]; ; char ch; while((ch=getchar())!=EOF){ str[k++]=ch; ...
- 异步解决方案----Promise与Await
前言 异步编程模式在前端开发过程中,显得越来越重要.从最开始的XHR到封装后的Ajax都在试图解决异步编程过程中的问题.随着ES6新标准的到来,处理异步数据流又有了新的方案.我们都知道,在传统的aja ...
- Dialogue between Jack and Rose【jack 和 Rose的对话】
Dialogue between Jack and Rose Rose : It's getting quiet. 越来越安静了 Jack : It's gonna take a couple of ...
- day14之模块
一.列表生成式与生成表达式 1.列表生成式(数据量小) 要求:在列表内造100个元素 示例: l=[] for i in range(100): l.append('egg%s'%i) print(l ...
- memset和memcpy
void memset(void s, int ch, size_t n); 函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 ...
- 基类View
尽管类视图看上去类的种类繁多,但每个类都是各司其职的,且从类的命名就可以很容易地看出这个类的功能.大致可分为如下三个大的功能块,分别由三个类提供对应的方法: 处理 HTTP 请求.根据 HTTP 请求 ...
- mysql中为int设置长度究竟是什么意思
根据个人的实验并结合资料:1.长度跟可以使用的值的范围无关,值的范围仅跟类型对应的存储字节数和是否unsigned有关:2.长度指的是显示宽度,比如,指定3位int,那么id为3和id为300的值,在 ...
- ASP.NET下调用ffmpeg与mencoder实现视频转换截屏
最近要做一个视频播放的系统,用到了ffmpeg和mencoder两个工具,查了一些资料,发现这方面的资料还挺多的,但是就是乱了一点,我自己从头整理了一下,和大家分享一下: 1.ffmpeg实现视频(a ...
- IOS开发学习笔记013-内存管理
内存管理 1.基本知识 2.关闭ARC机制 3.@property 4.循环引用 5.自动释放池 6.内存管理总结 一.基本知识 内存的分类 栈:局部变量 堆:动态申请的对象,变量等 全局(静态):s ...
- linux环境搭建系列之maven
前提: jdk1.7 Linux centOS 64位 安装包从官网获取地址:http://maven.apache.org/download.cgi Jdk1.7对应apache-maven-3.3 ...