[JZOJ5279]香港记者题解--最短路图
[JZOJ5279]香港记者题解--最短路图
题目链接
过 于 暴 力
分析
有一个naiive的想法就是从1到n跑最短路,中途建图,然后在图上按字典序最小走一遍,然而·这是不行的,你这样跳不一定能跳到终点.
所以应该是在1到n的最短路图上跳,怎么求有向图短路图?你跑一遍1到n得到\(dist1[]\),n到1的最短路得到\(dist[2]\),然后从1 BFS,对于原图一条\(u\),连向\(v\)的边,若\(dis1[u]+dis2[v]+dis(u,v)\)等于1到n的最短路距离,则最短路图上\(u\)到\(v\)也连一条相同的边
然后模拟一遍走最小的点就好了
结果跑了个rank倒2,看他们直接倒着一遍dij就完了,现在还搞不懂为什么...
另外我用了一次DFS就直接爆栈了,全改成了BFS
代码
/*
code by RyeCatcher
*/
const int maxn=800005;
const ll inf=1e17+19260817;
struct Edge{
int ne,to,o;
ll dis;
}edge[maxn<<1];
int h[maxn],num_edge=1;
inline void add_edge(int f,int to,ll c,int o){
edge[++num_edge].ne=h[f];
edge[num_edge].to=to;
edge[num_edge].dis=c;
edge[num_edge].o=o;
h[f]=num_edge;
}
int n,m,tag[maxn];
ll dis[maxn][2],all_dis;
struct SE{
int ne,to;
ll dis;
}se[maxn<<1];
int sh[maxn],num_se=1;
inline void add_se(int f,int to,ll c){
se[++num_se].ne=sh[f];
se[num_se].to=to;
se[num_se].dis=c;
sh[f]=num_se;
}
bool vis[maxn];int g[maxn][2];
inline void dijsktra(int st,int id){
Heap q;int u,v;
for(ri i=1;i<=n;i++)dis[i][id]=inf,vis[i]=0;
while(q.size())q.pop();
q.push(pii(0,st));dis[st][id]=0,g[st][id]=1;
while(q.size()){
u=q.top().second;q.pop();
if(vis[u])continue;
vis[u]=1;
for(ri i=h[u];i;i=edge[i].ne){
v=edge[i].to;
if(edge[i].o!=id)continue;
if(dis[v][id]>dis[u][id]+edge[i].dis){
dis[v][id]=dis[u][id]+edge[i].dis;
g[v][id]=1;
q.push(pii(dis[v][id],v));
}
}
}
return ;
}
void pre_bfs(){
int u,v;
queue<int> q;
q.push(1);memset(vis,0,sizeof(vis));
while(q.size()){
u=q.front();q.pop();
vis[u]=1;
for(ri i=h[u];i;i=edge[i].ne){
v=edge[i].to;
if(dis[u][0]+dis[v][1]+edge[i].dis==all_dis){
add_se(u,v,edge[i].dis);
if(!vis[v]){
q.push(v);
vis[v]=1;
}
}
}
}
return ;
}
int path[maxn],tot=0;
inline void bfs(){
queue <int> q;
memset(vis,0,sizeof(vis));
q.push(1);
int path[maxn],tot=0;
int u,v,tt,vv,dist=0,dd;
while(q.size()){
u=q.front();q.pop();vis[u]=1;
path[++tot]=tag[u];
if(u==n){
printf("%lld\n",all_dis);
for(ri i=1;i<=tot;i++)printf("%d ",path[i]);
puts("");
exit(0);
}
tt=1e9+7,vv=0;
for(ri i=sh[u];i;i=se[i].ne){
v=se[i].to;
if(v==n){
vv=v,dd=se[i].dis;
break;
}
if(vis[v]||!(g[v][1]&&g[v][0]))continue;
if(tag[v]<tt){
tt=tag[v],vv=v,dd=se[i].dis;
}
}
if(!vv)break;
q.push(vv),dist+=dd;
}
}
int main(){
int x,y,z;
//freopen("journalist7.in","r",stdin);
//freopen("wtf.out","w",stdout);
read(n),read(m);
for(ri i=1;i<=n;i++){
read(tag[i]);
}
for(ri i=1;i<=m;i++){
read(x),read(y),read(z);
add_edge(x,y,z,0);
add_edge(y,x,z,1);
}
dijsktra(1,0),dijsktra(n,1);
all_dis=dis[n][0];
pre_bfs();
bfs();
return 0;
}
[JZOJ5279]香港记者题解--最短路图的更多相关文章
- [NOIP2017]逛公园 最短路图 拓扑序DP
---题面--- 题解: 挺好的一道题. 首先我们将所有边反向,跑出n到每个点的最短路,然后f[i][j]表示从i号节点出发,路径长比最短路大j的方案数. 观察到,如果图中出现了0环,那么我们可以通过 ...
- JZOJ.5279【NOIP2017模拟8.15】香港记者
Description
- 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)
题意: 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花 ...
- Aizu - 1383 Pizza Delivery (最短路图+DAG上的割边)
题意:给出一张有向图,每条边有长度,对于每条边,你要回答将该边的方向取反后,从起点到终点的最短距离是增加or减小or不变. 首先求出起点到所有点的最短距离和所有点到终点的最短距离(两次DIjkstra ...
- 【题解】BZOJ5093图的价值(二项式+NTT)
[题解]BZOJ5093图的价值(二项式+NTT) 今天才做这道题,是我太弱了 强烈吐槽c++这种垃圾语言tmd数组越界不re反倒去别的数组里搞事情我只想说QAQ 推了一张A4纸的式子 考虑每个点的度 ...
- POJ-3268.SilverCowParty.(最短路 + 图的转置)
本题思路:对原图和原图的逆图分别用一次最短路,找出最大值即可. 一开始是我是对每个顶点spfa搜了一波,结果判题时间巨长,还好这个题的数据量不是很大,所以就用了另一种思路. 参考代码:spfa单结点爆 ...
- bzoj1266 [AHOI2006]上学路线route floyd建出最短路图+最小割
1266: [AHOI2006]上学路线route Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2490 Solved: 898[Submit][S ...
- codeforces Gym 100338C Important Roads (重建最短路图)
正反两次最短路用于判断边是不是最短路上的边,把最短路径上的边取出来建图.然后求割边.注意重边,和卡spfa. 正权,好好的dijkstra不用,用什么spfa? #include<bits/st ...
- HDU5521 Meeting 题解 最短路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521 题目大意: 有 \(n\) 个点 \(m\) 个集合,一个点可能处于若干个集合内,属于第 \(i ...
随机推荐
- Tracker 服务器地址大全 Tracker List
https://dns.icoa.cn/tracker/ udp://tracker.tiny-vps.com:6969/announce https://1337.abcvg.info/announ ...
- Windows下安装ActiveMQ
到官网(http://activemq.apache.org/download-archives.html)下载最新发布的压缩包(我下的是5.15.9)到本地后解压(我解压到D盘Dev目录下)即可.进 ...
- C/C++程序所占用内存区域
C/C++编译的程序所占用内存区域一般分为以下5个部分: 栈区(stack):由编译器自动分配和释放,用来存放函数的参数.局部变量等.其操作方式类似于数据结构中的栈. 堆区(heap):一般由程序员分 ...
- 货币转换函数:CURRENCY_CONVERTING_FACTOR
针对不同币别要做金额栏位转换 计算规则: 金额 = 原始金额 * 转换率 以下转自博客:https://www.cnblogs.com/sanlly/p/3371568.html 货币转换函数:CUR ...
- Python 解析式、生成器
标准库datetime datetime模块 对日期.时间.时间戳的处理 datetime类 类方法 today() 返回本地时区当前时间的datetime对象 now(tz=None) 返回当前时间 ...
- expect自动登录
.安装软件 yum install expect -y .查看expect命令位置 expect命令的位置也可能是在 /usr/local/bin/expect,使用前用户应确认工具是否存在(确认方法 ...
- 【leetcode_easy】581. Shortest Unsorted Continuous Subarray
problem 581. Shortest Unsorted Continuous Subarray 题意:感觉题意理解的不是非常明白. solution1: 使用一个辅助数组,新建一个跟原数组一模一 ...
- 基于Docker+Jenkins实现自动化部署
使用码云搭建Git代码存储仓库 https://gitee.com/login 使用码云创建私有私有git仓库 将本地springboot项目上传到git仓库中 基于Docker安装Jenkins环境 ...
- Golang 异常/日志处理
1.xerrors 异常 xerrors 包是一个非常棒的设计,不同于往常语言如java/php,因为go的errors只是一个string类型的映射,所以内存占用空间很少.这在golang的核心库和 ...
- NAT-地址转换技术的配置
(一)NAT的概念及工作原理 简单来讲,nat就是将私有网址转化为共有网址的技术.NAT通常部署在一个组织的网络出口位置,成为NAT网关.举个栗子,一段报文想离开私网,必须经过NAT网关将数据传输给公 ...