P2685 [TJOI2012]桥

xcxcli题解
下面思路仿照上述题解,代码基本照抄上述题解


u⇝vu\leadsto vu⇝v表示uuu到vvv的最短路
u→vu\to vu→v表示uuu和vvv直接相连的边
d1ud1_ud1u​表示1⇝u1\leadsto u1⇝u的最短路
dnudn_udnu​表示n⇝vn\leadsto vn⇝v的最短路

题意化简一下就是让你求删除一条边使得1⇝n1\leadsto n1⇝n最大化,并求删边方案数。

首先不难发现,如果我们选择删除的边不在1⇝n1\leadsto n1⇝n的路径上,并不会对1⇝n1\leadsto n1⇝n的大小产生影响,也就是如果要产生影响必须删除该路径上的一条边。

不妨假设1⇝n1\leadsto n1⇝n路径上的点如下
1→⋯→a→b→c→d→⋯→n1\to \dots\to a\to b{\color{red}\to} c \to d \to \dots \to n1→⋯→a→b→c→d→⋯→n
如果我们现在选择删除b→cb\to cb→c这条边,发现这条路径被切成两部分1→⋯→a→b1\to \dots\to a\to b1→⋯→a→b和c→d→⋯→nc \to d \to \dots \to nc→d→⋯→n,由于我们现在已经删除b→cb\to cb→c这条边,新的1⇝n1\leadsto n1⇝n一定是1⇝x⇝u→v⇝y⇝n1\leadsto x\leadsto u\to v\leadsto y\leadsto n1⇝x⇝u→v⇝y⇝n,并且x∈1→⋯→a→b,y∈c→d→⋯→nx\in 1\to \dots\to a\to b,y\in c \to d \to \dots \to nx∈1→⋯→a→b,y∈c→d→⋯→n

也就是我们现在让其强制走一条不在1⇝n1\leadsto n1⇝n上的路径即u→vu\to vu→v,并且走此路径能够避开b→cb\to cb→c,1⇝x⇝u→v⇝y⇝n1\leadsto x\leadsto u\to v\leadsto y\leadsto n1⇝x⇝u→v⇝y⇝n路径的权值显然是d1u+wu→v+dnvd1_u+w_{u\to v}+dn_vd1u​+wu→v​+dnv​,让其更新删除b→cb\to cb→c后1⇝n1\leadsto n1⇝n的最短路。

显然我们不能枚举x,yx,yx,y然后在枚举u→vu \to vu→v去更新删除b→cb\to cb→c的结果,有一个直接的想法就是1⇝x⇝u→v⇝y⇝n1\leadsto x\leadsto u\to v\leadsto y\leadsto n1⇝x⇝u→v⇝y⇝n路径能够避开哪些1→⋯→a→b→c→d→⋯→n1\to \dots\to a\to b{\color{red}\to} c \to d \to \dots \to n1→⋯→a→b→c→d→⋯→n的边,假设它能够避开a→b→c→da\to b\to c\to da→b→c→d显然这个结果能够更新删除a→ba\to ba→b或者b→cb\to cb→c或者c→dc\to dc→d的答案。

于是我们只需要枚举u→vu\to vu→v这条边(需要保证此边不在1⇝n1\leadsto n1⇝n的路径上),然后找到1⇝x⇝u→v⇝y⇝n1\leadsto x\leadsto u\to v\leadsto y\leadsto n1⇝x⇝u→v⇝y⇝n能够避开哪些边(仔细想想可知避开的路径一定是连续的),进行区间更新(线段树)即可。
这也是上述博客预处理LuL_uLu​和RuR_uRu​的原因!!!

有了上述两个数组那么1⇝x⇝u→v⇝y⇝n1\leadsto x\leadsto u\to v\leadsto y\leadsto n1⇝x⇝u→v⇝y⇝n避开的路径则是Lu⇝RvL_u \leadsto R_vLu​⇝Rv​之间的边。

dengyaotriangle详细证明

#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
using pii=pair<int,int>;
constexpr int N=100010,M=400010;
constexpr int INF=0x3f3f3f3f;
int h[N],e[M],ne[M],w[M],idx;
void add(int a,int b,int c){e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;}
int n,m;
bool st[N];
int d1[N],dn[N];
int path[N],cnt,id[N];
bool in[M];
int L[N],R[N],ans[N];
void dijkstra(int S,int d[])
{memset(d,0x3f,(n+1)*sizeof(int));memset(st,0,sizeof st);d[S]=0;priority_queue<pii,vector<pii>,greater<pii> >q;q.push({0,S});while(q.size()){int u=q.top().second;q.pop();if(st[u]) continue;st[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(d[v]<=d[u]+w[i]) continue;d[v]=d[u]+w[i];q.push({d[v],v});}}
}
void bfs(int k,int d[],int f[])
{queue<int> q;q.push(path[k]);f[path[k]]=k;while(q.size()){int u=q.front();q.pop();for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(!id[v]&&!f[v]&&d[u]+w[i]==d[v]) f[v]=k,q.push(v);}}
}
struct node
{int l,r,v;
}tree[N<<2];
void build(int u,int l,int r)
{tree[u]={l,r,INF};if(l==r) return;int mid=l+r>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);
}
void modify(int u,int l,int r,int x)
{if(tree[u].l>=l&&tree[u].r<=r) return tree[u].v=min(tree[u].v,x),void();int mid=tree[u].l+tree[u].r>>1;if(l<=mid) modify(u<<1,l,r,x);if(r>mid) modify(u<<1|1,l,r,x);
}
void pushdown(int u)
{if(tree[u].l==tree[u].r){ans[tree[u].l]=tree[u].v;return;}tree[u<<1].v=min(tree[u<<1].v,tree[u].v);tree[u<<1|1].v=min(tree[u<<1|1].v,tree[u].v);int mid=tree[u].l+tree[u].r>>1;pushdown(u<<1),pushdown(u<<1|1);}
int main()
{cin>>n>>m;memset(h,-1,sizeof h);for(int i=1;i<=m;i++){int a,b,c;cin>>a>>b>>c;add(a,b,c),add(b,a,c);}dijkstra(1,d1),dijkstra(n,dn);// 预处理1->n路径上的点int u=1;while(u!=n){path[++cnt]=u;id[u]=cnt;for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(dn[v]+w[i]==dn[u]) {in[i]=1;u=v;break;}}}path[++cnt]=n;id[n]=cnt;//1->n路径上的点 for(int i=1;i<=cnt;i++) bfs(i,d1,L),bfs(i,dn,R);--cnt;build(1,1,cnt);//我们将1->n路径上的边编号for(int u=1;u<=n;u++)for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(!in[i]&&L[u]<R[v])// L[u]->R[v]边的编号是L[u]->R[v]-1modify(1,L[u],R[v]-1,d1[u]+w[i]+dn[v]);}pushdown(1);int mx=0,res=0;for(int i=1;i<=cnt;i++){if(mx<ans[i]) mx=ans[i],res=1;else if(mx==ans[i]) res++;}if(mx==d1[n]) res=m;cout<<mx<<' '<<res<<'\n';
}

P2685 [TJOI2012]桥(最短路+线段树)相关推荐

  1. P2685 [TJOI2012]桥

    P2685 [TJOI2012]桥 思路: 先求出最短路: d1[u] : u 到 1 的最短路, d2[u] : u 到 n 的最短路 再求出一条从 1 到 n 的最短路链,然后从链上的每一个点出发 ...

  2. 洛谷3238 HNOI2014 道路阻塞 最短路 线段树(无代码)

    题目链接 题意: 给你一个nnn个点mmm条边的有向带权图,给你输入一条长度为lll的从111到nnn的最短路,问你把最短路上每一条边删去后从111到nnn的最短路长度是多少. n<=1e5,m ...

  3. [最短路/线段树大法优化DIJ] 【模板】单源最短路径(标准版)

    洛谷原题 这题我自己看了STL优先队列后试了试优化DIJ算法,但我这个菜比只有32分... 还是老老实实用线段树吧! 自己写的程序,反正AC了,线段树大法好! 具体见代码 #include<bi ...

  4. 2725. [Violet 6]故乡的梦(删边最短路同[TJOI2012]桥)

    2725. [Violet 6]故乡的梦 和P2685 [TJOI2012]桥可以说是一模一样,判断u,vu,vu,v是否在最短路径上可以利用之前预处理的id[]详细看代码. #include< ...

  5. BZOJ 2143 飞飞侠(线段树优化建边 / 并查集优化最短路)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2143 是 hydro 的 BZOJ ...

  6. [JZOJ6075]【GDOI2019模拟2019.3.20】桥【DP】【线段树】

    Description N,M<=100000,S,T<=1e9 Solution 首先可以感受一下,我们把街道看成一行,那么只有给出的2n个点的纵坐标是有用的,于是我们可以将坐标离散化至 ...

  7. CodeForces - 787D - Legacy(线段树优化建图+最短路)

    题目链接:点击查看 题目大意:给出 nnn 个点和 mmm 条边,现在需要求从 ststst 开始到所有点的最短路是多少,mmm 条边的给出方式如下: 1uvw1 \ u \ v \ w1 u v w ...

  8. [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)

    [NOI2018] 归程 description solution1 code1 solution2 code description 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要 ...

  9. 「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)

    「JOISC 2020 Day4」治疗计划 description solution 设dpi:1−Ridp_i:1-R_idpi​:1−Ri​ 都能被救治成功的最小花费 两个治疗方案[Li,Ri], ...

最新文章

  1. 如何编译文件(gcc + nasm)
  2. clear ,refresh,free
  3. Redis 持久化——RDB
  4. PointConv论文阅读笔记
  5. linux docker自动启动,linux – Cron作业不能在Docker容器内自动运行
  6. 以后再也不用看“教程”!概括【配置环境】的原理,小白也能举一反三的python配置环境过程!
  7. python 整数对应的字符,在Python中将字符串从字母解密为整数映射
  8. 关于数据元、元数据、主数据、交易数据、主题数据、数据资源、大数据、数据湖等数据相关概念理解和总结
  9. jvisualvm监控远程服务器,Jvisualvm监控远程tomcat
  10. g ++在linux下编译rapidxml 使用与过程中出现的问题解决
  11. slk文件转wma_什么是WMA文件(以及如何打开一个文件)?
  12. javascript中map和filter的区别
  13. 「星火计划沙龙视频」Angel核心推荐算法及其应用探秘
  14. Stapler#攻略
  15. 4、编写程序,根据用户输入的数字转换成相应的中文的大写数字。例如,1.23转换为“壹点贰叁”。
  16. PID控制算法原理通俗讲解
  17. 环境土壤物理模型 HYDRUS1D/2D/3D 应用
  18. Photoshop学习第4课-让你的照片漂亮一百倍的PS美颜术
  19. 时间序列分析|异常值检测
  20. PSpice仿真之建模-以半导体激光器为例

热门文章

  1. oracle日志文件大小规则,在线重做Oracle日志文件大小
  2. cascade down_Cascaded CNN 方法寻找人脸关键点
  3. python回到本次循环开头_Python中,当一个while循环判断为false,结束这个循环的时候,怎么进入到下一个循环中?...
  4. Java用TCP手写聊天室 可以 私聊版加群聊版
  5. [mybatis]select_resultMap_自定义结果集映射规则
  6. [Qt入门] QPushButton创建
  7. 蓝桥杯2016初赛-有奖猜谜-模拟
  8. SpringBoot项目新手——问题疑惑及解决笔记
  9. TCP连续ARQ协议和滑动窗口协议
  10. Java开发Web Service的几种解决方案