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. win10 uwp 萤火虫效果

    原文:win10 uwp 萤火虫效果 本文在Nukepayload2指导下,使用他的思想用C#写出来. 本文告诉大家,如何使用 win2d 做出萤火虫效果. 安装 win2d 安装win2d的方法请使 ...

  2. 我们错过了那么多机会,怎么办(就是预见未来的能力,并且要去做、要去投入,所以要主动学习、储备、选择,要不断的思考)good

    那天在IT职业咨询QQ群里聊天,提到腾讯.阿里,我说跟着这两家公司从小到大的朋友,都获得了不菲的回报,成了富翁或者财务自由了. 有群友感叹说:“是啊,我们错过了那么多机会.” 看到这句话,我心里一动, ...

  3. PowerShell将Windows store应用程序安装为开发者模式

    原文: PowerShell将Windows store应用程序安装为开发者模式 在本地部署Windows 商店应用程序时,我们会遇到Add-AppDevPackage.ps1脚本,这个脚本和所在安装 ...

  4. linux输出信息调试信息重定向

    最近在做一个android系统移植的项目,所使用的开发板com1是调试串口,就是说会有uboot和kernel的调试信息打印在com1上(ttySAC0).因为后期要使用ttySAC0作为上层应用通信 ...

  5. nyoj7——街区最短问题

    描述 一个街区有很多住户,街区的街道只能为东西.南北两种方向. 住户只可以沿着街道行走. 各个街道之间的间隔相等. 用(x,y)来表示住户坐在的街区. 例如(4,20),表示用户在东西方向第4个街道, ...

  6. QTcpSocket类和QTcpServer类

    QTcpSocket 详细描述:QTcpSocket 类提供一个TCP套接字TCP是一个面向连接,可靠的的通信协议,非常适合于连续不断的数据传递QTcpSocket 是QAbstractSocket类 ...

  7. QtScript, QML, Quick1, Quick2, Declarative 之间的关系

    QtScript是基于 ECMAScript 的脚本语言 在脚本中可以访问原有C++代码中的QObject类型及其子类的实例,连接信号和槽:也可以创建QObject类型及其子类的实例. 但是QtScr ...

  8. Realm_King 之 .NET 打包详细教程(A)

    最近一直在winform程序开发,听说身边的人不是很了解打包,给大家提供一点简单的打包,相信能看懂的... (一)右键解决方案: 在弹出"添加新项目"窗体中找到  其他项目类型=& ...

  9. QT5.7静态编译(使用VS2013与VS2015编译,XP可用,有详细configure脚本。VS下Qt插件的配置。编译选项加上-mp可以开启多线程编译,编译速度提高2倍以上)

    http://blog.csdn.net/u011964923/article/details/52886908 configure -confirm-license -opensource -pla ...

  10. ABP开发框架前后端开发系列---(12)配置模块的管理

    一般来说,一个系统或多或少都会涉及到一些系统参数或者用户信息的配置,而ABP框架也提供了一套配置信息的管理模块,ABP框架的配置信息,必须提前定义好配置的各项内容,然后才能在系统中初始化或者通过接口查 ...