题意

A,B两个人分别在1和n区。每个区有若干点(区之间的点可以重复,各个区内点间的距离一致),给出区之间有联系的图以及到达所需时间。求两个人见面最短时间以及在哪个区碰面(可有多个)

分析

隐式图搜索。但是注意一点:当我们搜索过一个区之后,这个区的最短路一定是被更新完成的,最短的(只要没有负权边)。因此,我们应当对已经访问过的点加一个标记,即可极大的剪枝,加快对隐式图的Dijkstra。

另一种做法

对于每个区定义一个新的虚拟点,区中的每个点到这点的距离是给定的\(t_i\)(不去生成一个完全图)。这样求最短路后距离除以二即可。

这样的做法可能在网络流中会比较有用,值得注意。

代码

注意行末空格,会让你丢一次PE。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <unordered_map>
#include <queue>
#define rep(i,a,b) for(repType i=(a);i<=(b);++i)
#define per(i,a,b) for(repType i=(a);i>=(b);--i)
#define fi first
#define ZERO(x) memset(x,0,sizeof(x))
#define se second
#define PB emplace_back
#define MP make_pair
using namespace std;
typedef long long ll;
typedef int repType; const int MAXN=2e5+5;
vector<int> ma[1000005];
vector<int> gra[MAXN];
ll cost[1000005];
ll dist[MAXN];
ll distb[MAXN],mindist,inf;
bool vis[1000005];
void dijkstra(int b, int n)
{
ZERO(vis);
memset(dist,0x3f,sizeof(dist));
inf=dist[0];
dist[b]=0;
typedef pair<ll,int> P;
priority_queue<P, vector<P>, greater<P> > pq;
pq.push(MP(0,b));
while(!pq.empty())
{
P now=pq.top();
pq.pop();
if(dist[now.se]<now.fi) continue;
/*
printf("Point %d belongs to set: ", now.se);
rep(i, 0, int(ma[now.se].size())-1)
{
cout<<ma[now.se][i]<<" ";
}
cout<<endl;
*/
rep(i, 0, int(ma[now.se].size())-1) //分别属于哪些集合
{
if(!vis[ma[now.se][i]]) // Important here!
vis[ma[now.se][i]]=true;
else continue;
/*
printf(" Set %d has pnts:", ma[now.se][i]);
rep(j,0,int(gra[ma[now.se][i]].size())-1)
printf("%d ",gra[ma[now.se][i]][j]);
cout<<endl;
*/
rep(j, 0, int(gra[ma[now.se][i]].size())-1) //集合分别有哪些点
{
int v=gra[ma[now.se][i]][j];
ll w=cost[ma[now.se][i]]; // 点是啥
if(dist[v]>dist[now.se]+w)
{
dist[v]=dist[now.se]+w;
//pre[now.se]=ma[now.se][i];
pq.push(MP(dist[v],v));
}
}
}
}
}
int main()
{
int T; scanf("%d",&T);
rep(kase, 1, T)
{
int n,m; scanf("%d%d", &n,&m);
rep(i,1,n) ma[i].clear();
rep(i,1,m) gra[i].clear();
rep(i,1,m)
{
int s; scanf("%lld%d", &cost[i], &s);
rep(j,1,s)
{
int tmp; scanf("%d",&tmp);
ma[tmp].PB(i); // 元素分别属于第几块
gra[i].PB(tmp); // 第几块 哪些元素
}
} dijkstra(1,n);
memcpy(distb,dist,sizeof(dist));
dijkstra(n,n);
mindist=inf;
vector<int> pnt; rep(i,1,n)
{
ll tmp=max(distb[i],dist[i]);
if(tmp==inf) continue;
if(tmp<mindist)
{
mindist=tmp;
pnt.clear(); pnt.PB(i);
}
else if(tmp==mindist)
{
pnt.PB(i);
}
}
printf("Case #%d: ",kase);
if(pnt.size()==0)
{
printf("Evil John\n");
}
else
{
printf("%lld\n",mindist);
rep(i,0,int(pnt.size())-1)
{
printf("%d",pnt[i]);
printf("%s",i==int(pnt.size())-1?"\n":" ");
}
}
}
return 0;
}

「赛后补题」Meeting(HDU-5521)的更多相关文章

  1. 「赛后补题」HBCPC2018题目代码与思路简析

    这次比赛(2018年第二届河北省大学生程序设计竞赛)虽然没有打,但是题目还是要写的.未完成的题目(还差比较硬核的四题)和思路分析会陆续更新完. Problem A 2011 Mex Query /* ...

  2. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  3. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  4. LOJ6003 - 「网络流 24 题」魔术球

    原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...

  5. LOJ6002 - 「网络流 24 题」最小路径覆盖

    原题链接 Description 求一个DAG的最小路径覆盖,并输出一种方案. Solution 模板题啦~ Code //「网络流 24 题」最小路径覆盖 #include <cstdio&g ...

  6. LOJ6001 - 「网络流 24 题」太空飞行计划

    原题链接 Description 有个实验和个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬仪器花费),并输出一组方案. Solution 实验向所需仪器连边,实验的点 ...

  7. LOJ6000 - 「网络流 24 题」搭配飞行员

    原题链接 题意简述 求二分图的最大匹配. 题解 这里写的是匈牙利算法. 表示节点的当前匹配. 为真表示在这一轮匹配中,无法给节点一个新的匹配.所以如果为真就不用再dfs它了,直接continue就好. ...

  8. LibreOJ #6014. 「网络流 24 题」最长 k 可重区间集

    #6014. 「网络流 24 题」最长 k 可重区间集 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   ...

  9. Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)

    Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流) Description G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n ...

随机推荐

  1. 关于最新版AFNetworking(3.0)上传多张图片的问题

    最新版的AF已经废弃了很多以前的类,所以很多以前的方法都不能用了,当然最主要还是为了适应ipV6所做的更改.楼主最近正在写多张图片上传,碰到了一些问题,解决之后直接封装了一个方法,废话有点多了,上代码 ...

  2. 打印iframe某区域

    <a href="#" onClick="parent.iframe名字.focus();window.print();">打印</a>

  3. textarea中输入字数的限制

    <textarea id="area" name="ss" placeholder="请输入文本内容" rows="10&q ...

  4. 类似"音速启动"的原创工具简码"万能助手"在线用户数终于突破100了!

    原本只是开发出来方便自己的一个小工具,看到群友也喜欢,就随手分享了, 经过1个多月的自然积累,在线用户数终于突破100了,这增长速度实在让人泪奔~ 博客园的朋友如果看到,喜欢的话就拿去用吧, 万能助手 ...

  5. stack permutation

    #include <iostream> #include <stack> #include <queue> using namespace std; bool ch ...

  6. linux 安全防护

    一.禁止ROOT用户远程登录 linux中root用户是超级管理员,可以针对root用户暴力破解密码,这样很不安全,工作中我们一般禁止root用户直接远程登陆,开设一个或多个普通用户,只允许登陆普通用 ...

  7. PHP的抽象类和抽象方法以及接口总结

    PHP中的抽象类和抽象方法自己用的不多,但是经常会在项目中看到别人使用,同样,今天在看别人的代码的时候,发现使用了抽象类,就总结下: 抽象类:1.如果一个类中有一个方法是抽象方法,则这个类就是抽象类: ...

  8. HTML5新标签兼容——> <!--<if lt IE 9><!endif-->

    第一种方法:(使用html5shiv) <!--[if lt IE9]> <script src="http://html5shiv.googlecode.com/svn/ ...

  9. Git 原理入门

    Git 是最流行的版本管理工具,也是程序员的必备技能之一. 即使天天使用它,很多人也未必了解它的原理.Git 为什么可以管理版本?git add.git commit这些基本命令,到底在做什么,你说得 ...

  10. 数据仓库和Hadoop大数据平台有什么差别?

    广义上来说,Hadoop大数据平台也可以看做是新一代的数据仓库系统, 它也具有很多现代数据仓库的特征,也被企业所广泛使用.因为MPP架构的可扩展性,基于MPP的数据仓库系统有时候也被划分到大数据平台类 ...