codeforces 757F Team Rocket Rises Again
正解:灭绝树。
mdzz倍增lca的根节点深度必须是1。。我因为这个错误调了好久。
我们考虑先求最短路,求完最短路以后,我们就能对原来的无向图构造一个DAG。当我们构造完DAG以后,我们要求的东西已经很明显。那就是删掉一个点以后,最多有多少个点与S不连通。那么,我们按照套路,将DAG跑一遍拓扑排序,建出灭绝树。然后求出除了S点以外的最大size就行了。
//It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define inf (1LL<<60)
#define M (300010)
#define N (200010)
#define il inline
#define RG register
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; struct edge{ int nt,to; ll dis; }g[*M],g1[*M],g2[*M]; int head[N],head1[N],head2[N],q[*N],d[N],vis[N],dep[N],sz[N],f[][N],S,n,m,num,num1,num2,ans;
ll dis[N]; il int gi(){
RG int x=,q=; RG char ch=getchar(); while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar(); while (ch>='' && ch<='') x=x*+ch-,ch=getchar(); return q*x;
} il void insert(RG int from,RG int to,RG ll dis){ g[++num]=(edge){head[from],to,dis},head[from]=num; return; } il void insert1(RG int from,RG int to){ g1[++num1]=(edge){head1[from],to},head1[from]=num1; return; } il void insert2(RG int from,RG int to){ g2[++num2]=(edge){head2[from],to},head2[from]=num2; return; } il void spfa(RG int S){
for (RG int i=;i<=n;++i) dis[i]=inf;
RG int h=,t=; dis[S]=,vis[S]=,q[t]=S;
while (h<t){
RG int x=q[++h];
for (RG int i=head[x],v=g[i].to;i;i=g[i].nt,v=g[i].to)
if (dis[v]>dis[x]+g[i].dis){
dis[v]=dis[x]+g[i].dis;
if (!vis[v]) vis[v]=,q[++t]=v;
}
vis[x]=;
}
return;
} il void dfs1(RG int x){
vis[x]=;
for (RG int i=head[x],v=g[i].to;i;i=g[i].nt,v=g[i].to)
if (dis[v]==dis[x]+g[i].dis){
insert1(x,v),insert2(v,x),d[v]++;
if (!vis[v]) dfs1(v);
}
return;
} il void dfs2(RG int x){
sz[x]=; RG int v;
for (RG int i=head[x];i;i=g[i].nt)
v=g[i].to,dfs2(v),sz[x]+=sz[v];
if (x!=S) ans=max(ans,sz[x]); return;
} il int lca(RG int u,RG int v){
if (u==v) return u; if (dep[u]<dep[v]) swap(u,v);
for (RG int i=;i>=;--i)
if (dep[f[i][u]]>=dep[v]) u=f[i][u];
if (u==v) return u;
for (RG int i=;i>=;--i)
if (f[i][u]!=f[i][v]) u=f[i][u],v=f[i][v];
return f[][u];
} il void topsort(){
RG int h=,t=; q[t]=S,dep[S]=; //不赋初值会跪烂!!!
while (h<t){
RG int x=q[++h],v;
for (RG int i=head1[x];i;i=g1[i].nt){
v=g1[i].to,d[v]--;
if (!d[v]){
q[++t]=v; RG int Lca=;
for (RG int j=head2[v];j;j=g2[j].nt)
if (!Lca) Lca=g2[j].to; else Lca=lca(Lca,g2[j].to);
insert(Lca,v,),f[][v]=Lca,dep[v]=dep[Lca]+;
for (RG int j=;j<=;++j) f[j][v]=f[j-][f[j-][v]];
}
}
}
return;
} il void work(){
n=gi(),m=gi(),S=gi();
for (RG int i=,u,v,w;i<=m;++i){
u=gi(),v=gi(),w=gi();
insert(u,v,(ll)w),insert(v,u,(ll)w);
}
spfa(S); dfs1(S); memset(head,,sizeof(head)),num=;
topsort(); dfs2(S); printf("%d\n",ans); return;
} int main(){
File("757F");
work();
return ;
}
codeforces 757F Team Rocket Rises Again的更多相关文章
- CF757F Team Rocket Rises Again——最短路+支配树
CF757F Team Rocket Rises Again 全体起立,全体起立,这是我A的第一道黑题(虽然是CF的): 来一波番茄攻击: 不扯淡了,这道题也是学习支配树(之前)应该做的题: 和灾难不 ...
- Codeforces 757 F Team Rocket Rises Again
Discription It's the turn of the year, so Bash wants to send presents to his friends. There are n ci ...
- Solution -「CF 757F」Team Rocket Rises Again
\(\mathcal{Description}\) link. 给定 \(n\) 个点 \(m\) 条边的无向图和一个源点 \(s\).要求删除一个不同与 \(s\) 的结点 \(u\),使得 ...
- cf757F Team Rocket Rises Again (dijkstra+支配树)
我也想要皮卡丘 跑一遍dijkstra,可以建出一个最短路DAG(从S到任意点的路径都是最短路),然后可以在上面建支配树 并不会支配树,只能简单口胡一下在DAG上的做法 建出来的支配树中,某点的祖先集 ...
- codeforces757F Team Rocket Rises Again【支配树+倍增+拓扑+spfa】
先跑spfa求出最短路构成的DAG,然后在DAG上跑出支配树dfs出size取max即可 关于支配树,因为是DAG,支配点就是入点在支配树上的lca,所以一边拓扑一边预处理倍增,然后用倍增求lca # ...
- CF757F Team Rocket Rises Again
题意 建出最短路图(DAG)之后就跟这题一样了. code: #include<bits/stdc++.h> using namespace std; #define int long l ...
- codeforces 932E Team Work(组合数学、dp)
codeforces 932E Team Work 题意 给定 \(n(1e9)\).\(k(5000)\).求 \(\Sigma_{x=1}^{n}C_n^xx^k\). 题解 解法一 官方题解 的 ...
- Codeforces 932E Team work 【组合计数+斯特林数】
Codeforces 932E Team work You have a team of N people. For a particular task, you can pick any non-e ...
- Codeforces 410C.Team[构造]
C. Team time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
随机推荐
- Solr field alias
Field alias Any field, function, or transformer can be displayed with a different name in the output ...
- php基础语法(20161021)
上午: 数据库总结: 1.创建数据库 create database 数据库名称 删除数据库 drop database 数据库名称 2.创建表 create table 表名 ( 列名 类型(长度) ...
- 关于easyUI的datebox加失去焦点事件即click、blur等
想实现日期框easyui-datebox手动输入值,手动输入失去焦点判断输入值是否合法 例如<input id="txtDate" type="text" ...
- Python自动生产表情包
作为一个数据分析师,应该信奉一句话--"一图胜千言".不过这里要说的并不是数据可视化,而是一款全民向的产品形态--表情包!!!! 表情包不仅仅是一种符号,更是一种文化--是促进社交 ...
- python 接口自动化测试--代码实现(八)
用例读入数据库: #! /usr/bin/python # coding:utf-8 import sys,os from Engine import DataEngine reload(sys) s ...
- gitignore文件中添加新过滤文件,但是此文件已经提交,如何解决?
gitignore文件中添加新过滤文件,但是此文件已经提交到远程库,如何解决? 第一步,为避免冲突需要先同步下远程仓库 git pull 第二步,在本地项目目录下删除缓存 git rm -r --ca ...
- centos5.11架设svn(svn系列 架设服务器 知识一总结)
♣svn是什么? ♣安装 --yum安装 --创建svn版本库目录 --创建版本库 --进入conf目录进行配置(该svn版本库配置文件) --启动svn版本库 - ...
- python 之栈的实现
#!/usr/bin/env python # --------------------------------------- # author : Geng Jie # email : gengji ...
- poptest老李谈数据结构中深度优先和广度优先
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...
- 关于android混淆文件project.properties和proguard-project.txt详解
一直不明白Android开发中的有些文件的具体作用,后来用到了,具体研究了一下,借鉴了一下网上的资料,最后总结下,方便以后查看! 老版本中有这么个文件default.properties,既然是老版本 ...