[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 ...
随机推荐
- mac kafka 环境搭建 以及PHP的kafka扩展
1.kafka安装 brew install kafka 安装会依赖zookeeper. 注意:安装目录:/usr/local/Cellar/kafka/0.10.2.0 2.安装的配置文件位置 /u ...
- python模块之request模块的理解
首先还是老生长谈,说说定义和作用,request模块是一个用于访问网络的模块,其实类似的模块还有很多,不在一一在这里解释.这么多的相似的模块为什么都说只有这个好用呢.因为他人性化.如果你学过urlli ...
- Kibana的安装与配置
Kibana的安装与配置 配置 [root@es01 kibana-5.6.3-linux-x86_64]# egrep -v '^$|^#' config/kibana.yml server.hos ...
- 002-创建型-01-工厂方法模式(Factory Method)
一.概述 定义一个创建对象的接口,但让实现这个接口的类来决定实例化那个类,工厂方法让类的实例化推迟到子类中进行. 工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称 ...
- json简单案例
1.Group类 import java.util.ArrayList; import java.util.List; class Group{ private int id; private Str ...
- PAT 甲级 1055 The World's Richest (25 分)(简单题,要用printf和scanf,否则超时,string 的输入输出要注意)
1055 The World's Richest (25 分) Forbes magazine publishes every year its list of billionaires base ...
- C#泛型学习
什么是泛型 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数 ...
- django模板---过滤器
过滤器 通过django的过滤器可以在无须编码的情况下完成一些基本工作,比如字母的大小写转换.日期转换.获取字符串的长度.过滤器要放到标签的标识符后面,中间用竖杠(|)分隔, 如下面的过滤器把name ...
- ELK之elasticsearch删除索引
参考文档:https://www.cnblogs.com/Dev0ps/p/9493576.html elasticsearch使用时间久了会产生大量索引占用磁盘空间,可以删除索引来释放 查看当前所有 ...
- 删除Excel表格中一堆英文中的汉字
昨天需要处理一个Excel文件,删除一堆英文里的汉字,开始搜了下方法,没找到,然后手动一个多小时,弄了一半吧也就,结果电脑卡了,忘了保存,就白做了...不知道为啥这次没有自动保存,所以,重要的事说三遍 ...