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 ...
随机推荐
- JVM运行和类加载过程
JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) (该知识点引用 http://www.cnblogs.com/dingyingsi/p/3760730.h ...
- 多线程爬坑之路-ThreadLocal源码及原理的深入分析
ThreadLocal<T>类:以空间换时间提供一种多线程更快捷访问变量的方式.这种方式不存在竞争,所以也不存在并发的安全性问题. This class provides thread-l ...
- 去掉标题栏的方法(使用requestWindowFeature(Window.FEATURE_NO_TITLE);为什么失效)
使用requestWindowFeature(Window.FEATURE_NO_TITLE)隐藏标题栏失效的原因,可能是activity继承的是AppCompatActivity.下面详细介绍了使用 ...
- RabbitMQ-从基础到实战(2)— 防止消息丢失
转载请注明出处 1.简介 RabbitMQ中,消息丢失可以简单的分为两种:客户端丢失和服务端丢失.针对这两种消息丢失,RabbitMQ都给出了相应的解决方案. 2.防止客户端丢失消息 如图,生产者P向 ...
- [转]利用excel进行线性规划求解
利用线性回归方法求解生产计划 方法一: 1.建立数学模型: 设变量:设生产拉盖式书桌x台,普通式书桌y台,可得最大利润 确定目标函数及约束条件 目标函 ...
- SVN操作手册(part1&part2)——SVN安装
SVN操作手册 1.关于SVN 有一个简单但不十分精确比喻: SVN = 版本控制 + 备份服务器 简单的说,您可以把SVN当成您的备份服务器,更好的是,他可以帮您记住每次上传到这个服务器的档案内容. ...
- java 文件操作(二)---Files和Path
自从java 7以来,引入了FIles类和Path接口.他们两封装了用户对文件的所有可能的操作,相比于java 1的File类来说,使用起来方便很多.但是其实一些本质的操作还是很类似的.主要需要知道的 ...
- iOS开发之数据存储之SQLite3(包括FMDB)
1.概述 SQLite3是一款开源的嵌入式关系型数据库,可移植性好.易使用.内存开销小. SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中.比如下列的创表语句是合法的: c ...
- HTTP协议(二)
一.请求的格式: (一).请求行 (1).请求方法 1.GET 2.POST 3.PUT 4.DELETE 5.TRACE 6.OPTIONS (2).请求路径 (3).所用的协议 (二).请求头信息 ...
- Unity - 通过降低精度减少动画文件的大小
Animation是Unity中的动画文件,主要内容由一个个关键帧数据构成.通过将Unity的资源序列化方式调整为Text,就可以以文本方式查看动画文件.通过菜单项Edit -> Project ...