HDU5521 Meeting


题意:

给你n个点,它们组成了m个团,第i个团内有si个点,且每个团内的点互相之间距离为ti,问如果同时从点1和点n出发,最短耗时多少相遇


很明显题目给出的是个无负环的图,且要跑出单源最短路,那不就是个dij吗

大方向定下,但图该怎么建呢?

way1:

给每个团内的所有点两两暴力建边



如图所示:黑的为点,红的为团,相同颜色的边长度相等

共 \(\sum ^{m}_{i=1}\dfrac {1}{2}s_{i}\left( s_{i}-1\right)\) 条边

而题面又告诉我们 \(\sum ^{m}_{i=1}s_{i}<=10^6\)

边数1e12这谁顶得住啊QuQ


way2:

我们再看上面这张图,发现同个团内类似三角形的东西其实是不需要的,因为反正有更近的直接连接的边,为啥还要再去绕个圈去松弛操作呢?

这时候我们就可以在每个团中建个虚点,改无向图为有向图,即实点可以0消耗到虚点,虚点要ti到实点

正如下图所示:



蓝色的为虚点,灰色的为从实点到虚点的路径,长度为0;彩色的为从虚点到实点的路径,长度为ti

边数是不是被减少到了 \(\sum ^{m}_{i=1}2s_{i}\) ?是不是很优秀?


建完图后,分别以1和n为起点,跑一遍最短路

\(Ans=min\{max\{点1到点i最短路,点n到点i最短路|1<=i<=n\}\}\)


ps.这道题十分毒瘤,我提交后曾四次PE,输出请注意你的空格以及换行,避免冗余

typedef long long ll;
const int N=2e5+5,M=4e6+5;
int en,T,n,m,h[N],cnt,ans[N],nm;
ll dis[2][N];
struct node{
int x; ll v;
inline bool operator < (const node &nt) const {return v>nt.v;}
};
struct edge{int n,v;ll w;}e[M]; //前向星存边
inline void add(const int &x,const int &y,const ll &z){e[++en]=(edge){h[x],y,z};h[x]=en;}
void dij(int s){ //一个堆优dijkstra模板
int pos; //小技巧,提前判断好当前最短路应存进哪个dis[]数组
if(s==1) pos=0;
else pos=1;
priority_queue<node> q;
memset(dis[pos],66,sizeof dis[pos]);
q.push((node){s,0});
dis[pos][s]=0;
while(!q.empty()){
node x=q.top();
q.pop();
if(x.v!=dis[pos][x.x]) continue;
for(int i=h[x.x];i;i=e[i].n){
int y=e[i].v;
if(dis[pos][x.x]+e[i].w<dis[pos][y]){
dis[pos][y]=dis[pos][x.x]+e[i].w;
q.push((node){y,dis[pos][y]});
}
}
}
}
signed main(){
scanf("%d",&T);
while(T--){
en=nm=0;
memset(h,0,sizeof h);
scanf("%d%d",&n,&m);
for(int i=1,t,s;i<=m;i++){
scanf("%d%d",&t,&s);
int center=n+i; //虚点
for(int i=1,x;i<=s;i++){
scanf("%d",&x);
add(x,center,0); //实点到虚点无长度
add(center,x,t); //虚点到实点有长度
}
}
dij(1); //从1跑
dij(n); //从n跑
ll MIN=dis[0][0];
for(int i=1;i<=n;i++){
ll tp=max(dis[0][i],dis[1][i]);
if(tp==MIN)
ans[++nm]=i; //nm记录当前最优解共有几个,ans[]记录这些满足最优解的下标
if(tp<MIN){
nm=1; //比当前最优解还优,刷新,重新从1开始
ans[1]=i;
MIN=tp;
}
}
printf("Case #%d: ",++cnt);
if(MIN==dis[0][0]) printf("Evil John\n"); //没有最优解->即无解
else{
printf("%lld\n",MIN);
for(int i=1;i<=nm;i++)
if(i<nm)
printf("%d ",ans[i]);
else
printf("%d\n",ans[i]); //最后一个后无空格
}
}
}

HDU5521 Meeting(dijkstra+巧妙建图)的更多相关文章

  1. 2018.10.30 NOIP模拟 有环无向图(dijkstra+巧妙建图)

    传送门 建图巧妙啊. 对于每个点的出边,我们将它们排序之后依次连边. 这样可以把O(m2)O(m^2)O(m2)的边数变成O(m)O(m)O(m)的了. 连的权值就是max(edgemax(edgem ...

  2. BZOJ4152 The Captain(dijkstra+巧妙建图)

    BZOJ4152 The Captain 题面很简洁: 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. 很明显 ...

  3. HDU5772 String problem 最大权闭合图+巧妙建图

    题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得 ...

  4. 【算法系列学习】巧妙建图,暴搜去重 Counting Cliques

    E - Counting Cliques http://blog.csdn.net/eventqueue/article/details/52973747 http://blog.csdn.net/y ...

  5. POJ-1122 FDNY to the Rescue!---Dijkstra+反向建图

    题目链接: https://vjudge.net/problem/POJ-1122 题目大意: 给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路 ...

  6. [Bzoj4289]PA2012 Tax(Dijkstra+技巧建图)

    Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...

  7. UVA1327 && POJ1904 King's Quest(tarjan+巧妙建图+强连通分量+缩点)

    UVA1327 King's Quest POJ1904 King's Quest 题意: 有n个王子,每个王子都有k个喜欢的妹子,每个王子只能和喜欢的妹子结婚.现有一个匹配表,将每个王子都与一个自己 ...

  8. 2015沈阳区域赛Meeting(最短路 + 建图)

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  9. Meeting HDU - 5521 虚点建图

    Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer John ...

随机推荐

  1. eclipse 插件编写(四)

    前言 前面几篇文章讲了下如果编写简单的eclipse插件,如创建插件项目.编写右键弹出菜单等功能,接下来主要写一下如何生成代码的功能,这一片的功能跟插件本身的编写关联不太大,主要处理插件之后的业务内容 ...

  2. UWP开发-在UWP中使用sqlite

    原文:UWP开发-在UWP中使用sqlite sqlite是一种轻量级的数据库,对于一些资源紧张又需要数据库的开发非常好用. SQLite 是一个开源的无服务器嵌入式数据库. 这些年来,它已作为面向存 ...

  3. PRML Chapter3

    曲线拟合的几种方法 最大似然估计MLE,最大后验概率MAP:MLE和MAP MLE 给定一堆数据,假如我们知道它是从某一种分布中随机取出来的,可是我们并不知道这个分布具体的参,即"模型已定, ...

  4. 网易Lofter

    作为老网虫,对网易的感情是很深的.当我知道Lofter这个东西后,曾经很兴奋要好好打理自己的博客,然而兴奋很快过了.因为Lofter无时无刻不在刷存在感.无限空间加无限图片流量,国内的服务无法做的更好 ...

  5. WebBrowser执行脚本和调用外部方法

    控制WebBrowser实际上就是控制IE,最简单的方法就是执行javascript或vbscript,省去了接口的转换.如何执行脚本?以前我一直用mshtml中IHTMLWindow2接口的exec ...

  6. asp.net mvc PC端二维码支付实例(微信二维码支付)

    一.微信支付方式介绍 微信提供了各种支付方式,试用于各种不同的支付场景,主要有如下几种: 1.刷卡支付 刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式.主要应用线 ...

  7. python代码检查工具pylint 让你的python更规范

    1.pylint是什么? Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅 ...

  8. 章节十四、7-如何切换到iFrame

    以下案例使用https://jqueryui.com/网站为例. 一.如何确定元素是否包含在iFarme中? 1.按F12打开发者选项,定位到指定的元素. 2.向上查找元素是否被包含在ifarme标签 ...

  9. Mac上刚安装的WebStorm或PHPStorm遇到SVN版本太旧的问题

    Mac上刚安装的WebStorm或PHPStorm遇到SVN版本太旧的问题: URL: svn: E155021: This client is too old to work with the wo ...

  10. MySQL之SQL优化详解(二)

    目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...