【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 ...
随机推荐
- spring data事务
事务在spring data中的使用 1:事务一般在service层.因为一个service方法可能会多次调用不同的dao,为了保证事务的完整性,那么多次的dao都放到一个方法里面 2:读的时候可以不 ...
- 三、Linux 系统目录结构
Linux 系统目录结构 登录系统后,在当前命令窗口下输入命令: ls / 你会看到如下图所示: 树状目录结构: 以下是对这些目录的解释: /bin:bin是Binary的缩写, 这个目录存放着最 ...
- 【PHP】PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
php编程中有时候会需要用上排序,在这里简单地整理一下集中sort的区别,方便查询 sort() 函数用于对数组单元从低到高进行排序. rsort() 函数用于对数组单元从高到低进行排序. asort ...
- 爬虫进阶之Selenium和chromedriver,动态网页(Ajax)数据抓取
什么是Ajax: Ajax(Asynchronouse JavaScript And XML)异步JavaScript和XML.过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意 ...
- pandas库Series类型与基本操作
pandas读取excel的类型是dataFrame,然后提取每一列是一个Series类型 Series类型包括index和values两部分 a = pd.Series({'a':1,'b':5}) ...
- 动态加载css,js
function dynamicLoadCss(url) { var head = document.getElementsByTagName('head')[0]; var link = docum ...
- day40--mysql step4 SQLAlchemy
1.unique = True 表示启动唯一索 2.有add 必须有commit这样数据才会提交 3.ORM功能 #!/usr/bin/env python # -*- coding:utf-8 -* ...
- 第九届极客大挑战 部分WP
CODE 和0xpoker分0day 百度 取石子游戏. https://blog.csdn.net/qq_33765907/article/details/51174524 已经说得很详细了,慢慢来 ...
- Python-S9-Day101 Vue-cli
01 昨天内容回顾 02 音乐播放器计算属性方法和组件创建 03 Vue-cli项目生成 04 模板中组件的使用 01 昨天内容回顾 1.1 {{xxx}}模板语法,插值,简单的运算: 1.2 指令系 ...
- shell执行mysql的脚本(包括mysql执行shell脚本)
在Shell中执行mysql的脚本,这里介绍比较容易使用的一种方法 首先写好sql的脚本,后缀为.sql,比如 sql_file.sql:内容如下 #这是SQL的脚本create table if n ...