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 ...
随机推荐
- 摆脱printf的噩梦
众所周知,printf是一个方便.直观.易写.变长参数的打印函数,但它有一个致命的缺陷,如下的语句将导致程序出现严重的运行时错误: printf("%s", 1); 然后程序中断, ...
- 安装Eclipse(android)新建项目时遇到的问题
---恢复内容开始--- 解决方案: 我先删掉了新建的项目,重新建立项目时 将API都选成相同的API19:... 然后就成功了 ---恢复内容结束---
- c/c++重定向输入输出
#define Local #include <iostream> #include <cstdio> //#include <stdio.h> using nam ...
- Web 页面测试总结—控件类
web端页面测试,最常见的是基本控件的测试,只有了解常见的控件和其测试方法,才能掌握测试要点,避免漏测情况发生.根据日常工作总结,将控件和常见逻辑集合在一起,总结了几个控件类测试查场景如下. 导航条 ...
- ArrayList去除重复元素(包括字符串和自定义对象)
1.去除重复字符串 package com.online.msym; import java.util.ArrayList; import java.util.Iterator; @SuppressW ...
- javascript 类型的判断
在平常写js代码,类型判断必不可少,那么我们常见有哪几种?看到了标题,先不看你会想到那些方法 ,常用呢些呢?那么今天我自己总结一些判断类型的判断,如有错,万望告知! 1:typeof 常用这种方法不错 ...
- C# 调用CMD执行命令行
这几天用c#做了一个项目,其中一个功能是要把生成的临时文件隐藏,同时,不能在屏幕上有调用CMD的痕迹,这里生成的临时文件的绝对路径为delfile为文件的绝对路径, 代码如下: private voi ...
- table切换
// 自己加载正确路径的jQ <!doctype html> <html><head><meta charset="utf-8">& ...
- SVN:重命名文件之后不允许提交
提交文件所属的目录,这样可以提交成功.
- 1145: 零起点学算法52——数组中删数II
1145: 零起点学算法52--数组中删数II Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lldSubmitted: 293 ...