Description

给定一个n个点,m条边的带权无向图,和起点S。请你选择一个点u(u!=S),使得在图中删掉点u 后,有尽可能多的点到S的最短距离改变。

Solution

先建出最短路DAG,在DAG中跑出灭绝树

灭绝树是一个点灭绝后子树中的点都灭绝的一棵树(灭绝在不同题目中意义不同)

先拓扑一下,每个点的最短路依赖的点就在它拓扑序前了

我们在拓扑序中从前往后扫

扫到点x,它的依赖点都已求出灭绝树父亲

x的灭绝树父亲就是它所有依赖点的灭绝树LCA

LCA可以用树上倍增求一下

Notice

1.可能有些点不连通

2.long long

Code

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <cctype>
  6. #include <algorithm>
  7. using namespace std;
  8. typedef long long LL;
  9. const int M=200007;
  10. const int E=600007;
  11. inline int rd(){
  12. int x=0;bool f=1;char c=getchar();
  13. for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
  14. for(;isdigit(c);c=getchar()) x=x*10+c-48;
  15. return f?x:-x;
  16. }
  17. int n,m,S;
  18. struct node{int x,y;LL d;}ed[E];
  19. int g[M],te;
  20. struct edge{
  21. int y,next;
  22. LL d;
  23. }e[E];
  24. void addedge(int x,int y,LL z){
  25. e[++te].y=y;
  26. e[te].d=z;
  27. e[te].next=g[x];
  28. g[x]=te;
  29. }
  30. int gd[M],td, gu[M],tu;
  31. struct link{
  32. int y,next;
  33. }dw[E],up[E];
  34. void adddw(int x,int y){
  35. dw[++td].y=y;
  36. dw[td].next=gd[x];
  37. gd[x]=td;
  38. }
  39. void addup(int x,int y){
  40. up[++tu].y=y;
  41. up[tu].next=gu[x];
  42. gu[x]=tu;
  43. }
  44. int que[M],vis[M];
  45. LL dis[M];
  46. void inc(int &x){x++;if(x>=M)x=0;}
  47. void spfa(int ss){
  48. int h=0,t=1,x,p,y;
  49. que[t]=ss;
  50. memset(dis,127,sizeof(dis));
  51. dis[ss]=0;
  52. vis[ss]=1;
  53. while(h^t){
  54. inc(h); x=que[h];
  55. for(p=g[x];p;p=e[p].next){
  56. y=e[p].y;
  57. if(dis[x]+e[p].d<dis[y]){
  58. dis[y]=dis[x]+e[p].d;
  59. if(!vis[y]){
  60. vis[y]=1;
  61. inc(t); que[t]=y;
  62. }
  63. }
  64. }
  65. vis[x]=0;//***********
  66. }
  67. }
  68. int indu[M];
  69. void Dag(){
  70. int i,x,y;
  71. for(i=1;i<=m;i++){
  72. x=ed[i].x;
  73. y=ed[i].y;
  74. if(dis[x]>dis[y]) swap(x,y);
  75. if(dis[x]+ed[i].d==dis[y]){
  76. adddw(x,y);
  77. addup(y,x);
  78. indu[y]++;
  79. }
  80. }
  81. }
  82. void topu(){
  83. int h=0,t=1,x,p,y;
  84. que[1]=S;
  85. while(h^t){
  86. x=que[++h];
  87. for(p=gd[x];p;p=dw[p].next){
  88. y=dw[p].y;
  89. indu[y]--;
  90. if(indu[y]==0) que[++t]=y;
  91. }
  92. }
  93. n=t;//排掉不连通的点*************************
  94. }
  95. int pre[M][22];
  96. int dep[M];
  97. int sz[M];
  98. int unit;
  99. int LCA(int x,int y){
  100. if(dep[x]<dep[y]) swap(x,y);
  101. int t;
  102. for(t=unit;t>=0;t--){
  103. if(dep[pre[x][t]]>=dep[y]) x=pre[x][t];
  104. }
  105. if(x==y) return x;
  106. for(t=unit;t>=0;t--){
  107. if(pre[x][t]!=pre[y][t]) x=pre[x][t], y=pre[y][t];
  108. }
  109. return pre[x][0];
  110. }
  111. int main(){
  112. int i,j,p,x,y,z;
  113. n=rd(), m=rd(), S=rd();
  114. for(i=1;i<=m;i++){
  115. x=rd(),y=rd(),z=rd();
  116. addedge(x,y,z);
  117. addedge(y,x,z);
  118. ed[i].x=x;
  119. ed[i].y=y;
  120. ed[i].d=(LL)z;
  121. }
  122. spfa(S);
  123. Dag();
  124. topu();
  125. unit=(int)(log(n)/log(2))+1;
  126. for(i=0;i<=unit;i++) pre[S][i]=S;
  127. dep[S]=1;
  128. for(i=2;i<=n;i++){
  129. x=que[i];
  130. z=0;
  131. for(p=gu[x];p;p=up[p].next){
  132. y=up[p].y;
  133. if(!z) z=y;
  134. else z=LCA(z,y);
  135. }
  136. pre[x][0]=z;
  137. dep[x]=dep[z]+1;
  138. for(j=1;j<=unit;j++) pre[x][j]=pre[pre[x][j-1]][j-1];
  139. }
  140. for(i=n;i>1;i--){
  141. x=que[i];
  142. sz[x]++;
  143. sz[pre[x][0]]+=sz[x];
  144. }
  145. sz[S]++;//不是sz[1]++;
  146. int ans=0;
  147. for(i=2;i<=n;i++)
  148. ans=max(ans,sz[que[i]]);
  149. printf("%d\n",ans);
  150. return 0;
  151. }

codeforces 757F - 最短路DAG+灭绝树的更多相关文章

  1. CF757F-Team Rocket Rises Again【最短路,DAG支配树】

    正题 题目链接:https://www.luogu.com.cn/problem/CF757F 题目大意 \(n\)个点\(m\)条边的一张无向图,求删除\(s\)以外的一个点改变\(s\)到最多点的 ...

  2. codeforces 757F Team Rocket Rises Again

    链接:http://codeforces.com/problemset/problem/757/F 正解:灭绝树. mdzz倍增lca的根节点深度必须是1..我因为这个错误调了好久. 我们考虑先求最短 ...

  3. bzoj 2815 灭绝树

    对于一个食物网(一个DAG),一个物种死亡后,某些物种就必然死亡,求出必然死亡的是那些物种. 灭绝树的另一种含义是:“灭绝树跟节点到节点u的路径上的节点由那些原图中从根节点到节点u的所有路径中都经过了 ...

  4. Codeforces 219D. Choosing Capital for Treeland (树dp)

    题目链接:http://codeforces.com/contest/219/problem/D 树dp //#pragma comment(linker, "/STACK:10240000 ...

  5. 最短路DAG

    边权皆为正时,有最短路DAG. 最短路DAG代表了从原点到每个点的所有最短路. 最短路树个数=最短路DAG生成树个数.用DAG生成树计数即可.复杂度\(O(n+m)\).

  6. [HAOI2012]道路(最短路DAG上计数)

    C国有n座城市,城市之间通过m条[b]单向[/b]道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我们需要对每 ...

  7. Codeforces 633C Spy Syndrome 2 | Trie树裸题

    Codeforces 633C Spy Syndrome 2 | Trie树裸题 一个由许多空格隔开的单词组成的字符串,进行了以下操作:把所有字符变成小写,把每个单词颠倒过来,然后去掉单词间的空格.已 ...

  8. 【BZOJ4912】天才黑客(最短路,虚树)

    [BZOJ4912]天才黑客(最短路,虚树) 题面 BZOJ 洛谷 题解 \(Anson\)爷讲过的题目,然而我还是不会做 只有照着\(zsy\)的程序打我才会做....果然太弱了. 这道题目显然是把 ...

  9. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

随机推荐

  1. 制定RPM包和加入YUM源

    ##################################################### ##如有转载,请务必保留本文链接及版权信息 ##欢迎广大运维同仁一起交流linux/unix ...

  2. Linux 系统中 sudo 命令的 10 个技巧

    概览 sudo 表示 "superuser do". 它允许已验证的用户以其他用户的身份来运行命令.其他用户可以是普通用户或者超级用户.然而,大部分时候我们用它来以提升的权限来运行 ...

  3. POJ3320 尺取法的正确使用法

    一.前言及题意: 最近一直在找题训练,想要更加系统的补补思维,补补漏洞什么的,以避免被个类似于脑筋急转弯的题目干倒,于是在四处找书,找了红书.蓝书,似乎都有些不尽如人意.这两天看到了日本人的白书,重新 ...

  4. Tomcat 在 Linux 下的自动启动脚本

    很多服务都需要设置为开机自启动.将下面代码复制到 /etc/rc.d/init.d/tomcat ,然后执行 chkconfig –add tomcat chkconfig tomcat on 就可以 ...

  5. shell脚本入门基础知识

    shell 脚本的第一行 #!/bin/bash #!/bin/sh 其实,sh是bash的一个软链接 sh -> bash 变量,字母下划线开头(好像是没有类型的) #普通变量 var1=ni ...

  6. Python中bisect的使用方法

    Python中列表(list)的实现其实是一个数组,当要查找某一个元素的时候时间复杂度是O(n),使用list.index()方法,但是随着数据量的上升,list.index()的性能也逐步下降,所以 ...

  7. RF、GBDT、XGBOOST常见面试算法整理

    1.  RF(随机森林)与GBDT之间的区别 相同点: 1)都是由多棵树组成的 2)最终的结果都是由多棵树一起决定 不同点: 1)  组成随机森林的树可以是分类树也可以是回归树,而GBDT只由回归树组 ...

  8. 了解Windows Server以及Hyper-V许可模式

    在2015年11月,微软宣布对Windows Server 2016以及Hyper-V的许可模式进行重大变更,并于2016年第三季度正式生效,Windows Server 2016标准版及数据中心版的 ...

  9. IOS开发学习笔记017-第一个IOS应用

    第一个IOS应用程序,就从最简单的开始吧. 1.先了解一下开发环境,Xcode的相关组成 2.还有模拟器 3.运行与停止按钮 4.新建一个工程 5.看看main函数里都有啥 6.现在来添加一个控件 1 ...

  10. phpmyadmin漏洞利用general_log和general_log_file拿权限

    我们如果知道phpmyadmin和网站的绝对路径后,可以利用into outfile写马拿到权限,但是吧有新版本的mysql和一些系统设置的问题这个函数受到了secure-file-priv这个的影响 ...