CF757F Team Rocket Rises Again 全体起立,全体起立,这是我A的第一道黑题(虽然是CF的): 来一波番茄攻击: 不扯淡了,这道题也是学习支配树(之前)应该做的题: 和灾难不同的是,那个是直接给你有向图,这里给的是无向图: 我们要求的是删除一个点会造成多少点的最短路发生变化,那么我们可以根据最短路再建一个有向图,这样就和灾难一样了: 很不幸,我建了四个图: 因为一开始写挂了所以图的编号是乱的:(这并不影响我AC)add是无向图,add2是有向图,add4是反图,add3…
我也想要皮卡丘 跑一遍dijkstra,可以建出一个最短路DAG(从S到任意点的路径都是最短路),然后可以在上面建支配树 并不会支配树,只能简单口胡一下在DAG上的做法 建出来的支配树中,某点的祖先集就是从S到该点的必经点集,也就是说,炸掉某点,这个子树都会变得angryunhappy 大概就是按拓扑序来建这个树,每条边(u,v)是要把fa[v]=lca(u,fa[v]),等到v的入度为零时,再用最终的fa[v]连到v上,然后给v做以后求lca时倍增的预处理 最后dfs算出来除S点的最大的子树大…
正题 题目链接:https://www.luogu.com.cn/problem/CF757F 题目大意 \(n\)个点\(m\)条边的一张无向图,求删除\(s\)以外的一个点改变\(s\)到最多点的最短路. 解题思路 挺裸的一道题的,首先肯定要跑一遍最短路搞出最短路树. 然后如果最短路树上\(s\)到某个点的路径被割掉了就会改变最短路长度,所以直接求出支配树然后看除了根以外最大子树的子节点就好了. 时间复杂度\(O(m\log n)\) code #include<cstdio> #incl…
题意 建出最短路图(DAG)之后就跟这题一样了. code: #include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define mkp make_pair #define fir first #define sec second const int maxn=2*1e5+10; const int maxm=3*1e5+10; int n,m,st…
Discription It's the turn of the year, so Bash wants to send presents to his friends. There are n cities in the Himalayan region and they are connected by m bidirectional roads. Bash is living in city s. Bash has exactly one friend in each of the oth…
先跑spfa求出最短路构成的DAG,然后在DAG上跑出支配树dfs出size取max即可 关于支配树,因为是DAG,支配点就是入点在支配树上的lca,所以一边拓扑一边预处理倍增,然后用倍增求lca #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> using namespace std; const int N=400005…
\(\mathcal{Description}\)   link.   给定 \(n\) 个点 \(m\) 条边的无向图和一个源点 \(s\).要求删除一个不同与 \(s\) 的结点 \(u\),使得有最多的点到 \(s\) 的最短距离改变.求出此时最短距离改变的结点的数量.   \(n\le2\times10^5,m\le3\times10^5\). \(\mathcal{Solution}\)   首先,以 \(s\) 为源点跑一个单源最短路.设 \(s\) 到 \(u\) 的距离为 \(d…
Description 给定一个n个点,m条边的带权无向图,和起点S.请你选择一个点u(u!=S),使得在图中删掉点u 后,有尽可能多的点到S的最短距离改变. Solution 先建出最短路DAG,在DAG中跑出灭绝树 灭绝树是一个点灭绝后子树中的点都灭绝的一棵树(灭绝在不同题目中意义不同) 先拓扑一下,每个点的最短路依赖的点就在它拓扑序前了 我们在拓扑序中从前往后扫 扫到点x,它的依赖点都已求出灭绝树父亲 x的灭绝树父亲就是它所有依赖点的灭绝树LCA LCA可以用树上倍增求一下 Notice…
Description P2597 [ZJOI2012]灾难 - 洛谷 | 计算机科学教育新生态 Solution 根据题意建图, 新建一个 \(S\) 点, 连向每个没有入边的点. 定义每个点 \(P\) 的支配点为从 \(S\) 到 \(P\) 的任意路径必经的点. 那么题意便为对于每一个点, 求有多少个点以它作为支配点. 考虑建立一棵支配树, 其中除了 \(S\) 之外的点 \(P\) 的父亲 \(\text{fa} (P)\) 表示距离 \(P\) 最近的支配点. 显然 \(\text{…
链接:http://codeforces.com/problemset/problem/757/F 正解:灭绝树. mdzz倍增lca的根节点深度必须是1..我因为这个错误调了好久. 我们考虑先求最短路,求完最短路以后,我们就能对原来的无向图构造一个DAG.当我们构造完DAG以后,我们要求的东西已经很明显.那就是删掉一个点以后,最多有多少个点与S不连通.那么,我们按照套路,将DAG跑一遍拓扑排序,建出灭绝树.然后求出除了S点以外的最大size就行了. //It is made by wfj_20…