HDU5521 Meeting(dijkstra+巧妙建图)
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+巧妙建图)的更多相关文章
- 2018.10.30 NOIP模拟 有环无向图(dijkstra+巧妙建图)
		
传送门 建图巧妙啊. 对于每个点的出边,我们将它们排序之后依次连边. 这样可以把O(m2)O(m^2)O(m2)的边数变成O(m)O(m)O(m)的了. 连的权值就是max(edgemax(edgem ...
 - BZOJ4152 The Captain(dijkstra+巧妙建图)
		
BZOJ4152 The Captain 题面很简洁: 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. 很明显 ...
 - HDU5772  String problem 最大权闭合图+巧妙建图
		
题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得 ...
 - 【算法系列学习】巧妙建图,暴搜去重 Counting Cliques
		
E - Counting Cliques http://blog.csdn.net/eventqueue/article/details/52973747 http://blog.csdn.net/y ...
 - POJ-1122 FDNY to the Rescue!---Dijkstra+反向建图
		
题目链接: https://vjudge.net/problem/POJ-1122 题目大意: 给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路 ...
 - [Bzoj4289]PA2012 Tax(Dijkstra+技巧建图)
		
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
 - UVA1327 && POJ1904 King's Quest(tarjan+巧妙建图+强连通分量+缩点)
		
UVA1327 King's Quest POJ1904 King's Quest 题意: 有n个王子,每个王子都有k个喜欢的妹子,每个王子只能和喜欢的妹子结婚.现有一个匹配表,将每个王子都与一个自己 ...
 - 2015沈阳区域赛Meeting(最短路 + 建图)
		
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
 - Meeting HDU - 5521 虚点建图
		
Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer John ...
 
随机推荐
- shell转义符
			
转义是一种引用单个字符的方法. 一个前面放上转义符 (\)的字符就是告诉shell这个字符按照字面的意思进行解释, 换句话说, 就是这个字符失去了它的特殊含义. 在某些特定的命令和工具中, 比如ech ...
 - SimpleMembership,成员资格提供程序、 通用的提供者和新的 ASP.NET 4.5 Web 窗体和 ASP.NET MVC 4 模板
			
ASP.NET MVC 4 互联网模板中添加一些新的. 非常有用的功能,构建 SimpleMembership.这些更改将添加一些很有特色,像很多更简单. 可扩展会员 API 和 OAuth 的支持. ...
 - Delphi开发 Android 程序启动画面简单完美解决方案
			
原文在这里 还是这个方法好用,简单!加上牧马人做的自动生成工具,更是简单. 以下为原文,向波哥敬礼! 前面和音儿一起研究 Android 下启动画面的问题,虽然问题得到了解决,但是,总是感觉太麻烦,主 ...
 - [Err] 1146 - Table 'performance_schema.session_status' doesn't exist已解决
			
刚刚接触MySQL,就往数据库添加数据,就遇到这个问题 解决方案就是找到你安装MySQL的bin目录 然后在cmd输入 mysql_upgrade -u root -p --force 回车,然后输入 ...
 - Java基础(二)  基本类型数据类型、包装类及自动拆装箱
			
我们知道基本数据类型包括byte, short, int, long, float, double, char, boolean,对应的包装类分别是Byte, Short, Integer, Long ...
 - 『 效率工具 』Spring Boot版的轻量级代码生成器,减少70%以上的开发任务
			
一. 前言 之前很着迷于代码自动生成,减少写重复代码的工作量.网络上也搜索了很久,有基于插件的,有GUI的.但其配置和学习成本都比较高,都不是很如我意. 本想自己用SpringBoot写一个,在收集相 ...
 - Spring Boot:快速入门教程
			
什么是Spring Boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...
 - 10 关于DOM的操作
			
一.JavaScript的组成 JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:文档对象 ...
 - JS数据结构第四篇 --- 栈
			
一.什么是数据结构栈 在数据结构中有一个栈结构,在内存空间中也有一个栈空间,这两个”栈“是两个不同的概念.这篇我们说的是数据结构中的栈.栈是一种特殊的线性表,特殊性在哪?就是只能在栈顶进行操作,往栈顶 ...
 - Java NIO 学习笔记(四)----文件通道和网络通道
			
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...