[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. yum安装PostgreSQL 在6和7

    一.安装PostgreSQL 复制代码// 安装EPEL源# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.n ...

  2. jquery页面滚动到指定id

    //jquery页面滚动到指定id  $body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html ...

  3. [转][C#]dll 引用

    本文转自:https://zhidao.baidu.com/question/1176198151354174139.html 首先,对应关系: C++ C#===================== ...

  4. 8个华丽而实用的Java图表类库

    8个华丽而实用的Java图表类库 转 https://www.300168.com/yidong/show-2744.html   核心提示:学习Java的同学注意了!!! 学习过程中遇到什么问题或者 ...

  5. 算法习题---4-6莫尔斯电码(UVa508)

    一:题目 A-Z0-9分别对应一些莫尔斯电码字符串 A .- B -... C -.-. D -.. E . F ..-. G --. H .... I .. J .--- K -.- L .-.. ...

  6. mouse without borders无界鼠标使用教程

    mouse without borders无界鼠标使用教程 摘自https://www.jianshu.com/p/6a0209ad03f8   老黑随笔 关注  0.4 2018.05.18 11: ...

  7. Dubbo -- 关于 api接口调用不使用强依赖

    首先,我们都知道  Dubbo 调用api 需要提供暴露  接口,   消费端才通过 ZK 可以调用 通常我们都会使用 提供 api  jar包 的方式 使用  这样既方便又快捷 简单 只需要在spr ...

  8. jmeter -- beanshell 执行本地py文件

    Process proc = Runtime.getRuntime().exec("python /Users/lucax/Desktop/工作/Ai双师项目/性能优化迭代_脚本准备/获取学 ...

  9. 讲sql注入原理的 这篇不错(有空可以看看)

    我们围绕以下几个方面来看这个问题: 1.什么是sql注入? 2.为什么要sql注入? 3.怎样sql注入? 1.什么是sql注入? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或 ...

  10. Ubuntu 14.04 apache安装配置

    http://jingyan.baidu.com/article/6d704a130c8a0d28da51ca5f.html Ubuntu 14.04 apache安装配置 1.安装 ~# apt-g ...