[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]香港记者题解--最短路图的更多相关文章

  1. [NOIP2017]逛公园 最短路图 拓扑序DP

    ---题面--- 题解: 挺好的一道题. 首先我们将所有边反向,跑出n到每个点的最短路,然后f[i][j]表示从i号节点出发,路径长比最短路大j的方案数. 观察到,如果图中出现了0环,那么我们可以通过 ...

  2. JZOJ.5279【NOIP2017模拟8.15】香港记者

    Description

  3. 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)

    题意: 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花 ...

  4. Aizu - 1383 Pizza Delivery (最短路图+DAG上的割边)

    题意:给出一张有向图,每条边有长度,对于每条边,你要回答将该边的方向取反后,从起点到终点的最短距离是增加or减小or不变. 首先求出起点到所有点的最短距离和所有点到终点的最短距离(两次DIjkstra ...

  5. 【题解】BZOJ5093图的价值(二项式+NTT)

    [题解]BZOJ5093图的价值(二项式+NTT) 今天才做这道题,是我太弱了 强烈吐槽c++这种垃圾语言tmd数组越界不re反倒去别的数组里搞事情我只想说QAQ 推了一张A4纸的式子 考虑每个点的度 ...

  6. POJ-3268.SilverCowParty.(最短路 + 图的转置)

    本题思路:对原图和原图的逆图分别用一次最短路,找出最大值即可. 一开始是我是对每个顶点spfa搜了一波,结果判题时间巨长,还好这个题的数据量不是很大,所以就用了另一种思路. 参考代码:spfa单结点爆 ...

  7. bzoj1266 [AHOI2006]上学路线route floyd建出最短路图+最小割

    1266: [AHOI2006]上学路线route Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2490  Solved: 898[Submit][S ...

  8. codeforces Gym 100338C Important Roads (重建最短路图)

    正反两次最短路用于判断边是不是最短路上的边,把最短路径上的边取出来建图.然后求割边.注意重边,和卡spfa. 正权,好好的dijkstra不用,用什么spfa? #include<bits/st ...

  9. HDU5521 Meeting 题解 最短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521 题目大意: 有 \(n\) 个点 \(m\) 个集合,一个点可能处于若干个集合内,属于第 \(i ...

随机推荐

  1. http-proxy-middleware及express实现反向代理

    $ npm install --save-dev http-proxy-middleware npm install express // 引用依赖 var express = require('ex ...

  2. connections java.net.BindException: Address already in use_解决方案

    一.问题描述 在Linux服务器(CentOS7系统)中配置并启动JMeter远程监控服务器资源所需的ServerAgent目录下的 startAgent.sh 文件时,系统出现异常提示,如 [roo ...

  3. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_13-用户退出-前端

    调试前端的退出 logout方法 找到路由 退出对应的组件页面 这就是退出的组件 退出的方法 把这两个js的引用,从上面复制到下面引用.因为可能存在js的冲突问题. 资料里面给了一个前端 整个覆盖当前 ...

  4. java项目中ehcache缓存最简单用法

      java项目中ehcache缓存最简单用法: 1.下载ehcache-core-2.4.3.jar复制到项目的lib目录下 2.新建ehcache.xml文件,放置在项目src目录下的resour ...

  5. office激活方式,超简单

    只需要安装个小小的程序,亲测安全可靠 详情点击下方链接 https://blog.csdn.net/weixin_40941966/article/details/80872533

  6. Oracle中查询当前时间、时间格式化方法

    Oracle中如何获取系统当前时间 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;  ORACLE里获取一个时间的年.季.月.周. ...

  7. JS读取本地文件及目录的方法

    Javascript是网页制作中离不开的脚本语言,依靠它,一个网页的内容才生动活泼.富有朝气.但也许你还没有发现并应用它的一些更高级 的功能吧?比如,对文件和文件夹进行读.写和删除,就象在VB.VC等 ...

  8. jenkins的maven插件

    如图所示的maven项目也是一个jenkins插件:https://github.com/jenkinsci/maven-plugin 可以在插件管理里面安装:

  9. 记录一下我的git连接不上GitHub问题

    1.日常操作,提交代码,报错误下: $ git clone git@github.com:hanchao5272/myreflect.git Cloning into 'myreflect'... s ...

  10. win10 1803 频繁死机,卡死不动

    摘自微软官网的解决办法,我的目测好像是可以了. 小娜搜索框输入“PowerShell”选择在管理员命令提示符下键入以下命令: Dism /Online /Cleanup-Image /ScanHeal ...