链接:codeforces 757F

正解:灭绝树。

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的更多相关文章

  1. CF757F Team Rocket Rises Again——最短路+支配树

    CF757F Team Rocket Rises Again 全体起立,全体起立,这是我A的第一道黑题(虽然是CF的): 来一波番茄攻击: 不扯淡了,这道题也是学习支配树(之前)应该做的题: 和灾难不 ...

  2. 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 ...

  3. Solution -「CF 757F」Team Rocket Rises Again

    \(\mathcal{Description}\)   link.   给定 \(n\) 个点 \(m\) 条边的无向图和一个源点 \(s\).要求删除一个不同与 \(s\) 的结点 \(u\),使得 ...

  4. cf757F Team Rocket Rises Again (dijkstra+支配树)

    我也想要皮卡丘 跑一遍dijkstra,可以建出一个最短路DAG(从S到任意点的路径都是最短路),然后可以在上面建支配树 并不会支配树,只能简单口胡一下在DAG上的做法 建出来的支配树中,某点的祖先集 ...

  5. codeforces757F Team Rocket Rises Again【支配树+倍增+拓扑+spfa】

    先跑spfa求出最短路构成的DAG,然后在DAG上跑出支配树dfs出size取max即可 关于支配树,因为是DAG,支配点就是入点在支配树上的lca,所以一边拓扑一边预处理倍增,然后用倍增求lca # ...

  6. CF757F Team Rocket Rises Again

    题意 建出最短路图(DAG)之后就跟这题一样了. code: #include<bits/stdc++.h> using namespace std; #define int long l ...

  7. codeforces 932E Team Work(组合数学、dp)

    codeforces 932E Team Work 题意 给定 \(n(1e9)\).\(k(5000)\).求 \(\Sigma_{x=1}^{n}C_n^xx^k\). 题解 解法一 官方题解 的 ...

  8. 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 ...

  9. Codeforces 410C.Team[构造]

    C. Team time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

随机推荐

  1. 使用js实现ajax的get请求步骤

    (以下内容非原创,视频整合得来的) 1.创建XMLHttpRequest对象 2.浏览器与服务器建立连接 3.浏览器向服务器发送请求 4.服务器向浏览器响应请求 下面给出一个实例 1.创建一个test ...

  2. Vue学习之路---No.5(分享心得,欢迎批评指正)

    同样,首先我们还是回顾一下昨天讲到的东西: 1.常用的Vue修饰器 2.当利用js方法不修改数据,但也可以改变视图时,我们需要整体返回再整体接收 (如: items.example1 = items. ...

  3. git中常见的几个命令

    git中常见的几个命令 本地仓库 三个区域 工作目录 暂存区 本地仓库 文件的四个状态 未跟踪 untracked 已暂存 staged 已提交commited 已修改 modified 基本命令 g ...

  4. node.js 基础知识之 querystring.stringify querystring.escape

    序列化   1.  querystring.stringify({name:'chenshuai',ago:21,job:"web"})    'name=chenshuai&am ...

  5. Entity Framework — ( Database First )

    什么是Entity Framework Entity Framework是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案.将数据存储从域对象自动映射到关系 ...

  6. 配置远程服务器,使hyper-v能够连接网络

    一般远程服务器只有一个网卡和IP,如果你要在服务器上装虚拟机,那么要使虚拟机能够连接网络,必须要创建虚拟交换机. 如果创建虚拟交换机并桥接,那么就会改变IP地址,改变IP地址,就连接不上远程服务器.造 ...

  7. c#实现list,dataset,DataTable转换成josn等各种转换方法总和

    using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Refle ...

  8. iOS开发之iOS程序的启动过程

    程序启动的完整过程: (1)main函数 (2)UIApplicationMain * 创建UIApplication对象 * 创建UIApplication的delegate对象 (3)delega ...

  9. 多线程CountDownLatch和Join

    如果现在有五个线程A.B.C.D.E,请问如何用E线程用于统计A.B.C.D四个线程的结果? 题意需要用E线程统计A.B.C.D四个线程,也就是说E线程必须要等到前面四个线程运行结束之后才能执行.那么 ...

  10. go单元测试进阶篇

    作者介绍:熊训德(英文名:Sundy),16年毕业于四川大学大学并加入腾讯.目前在腾讯云从事hadoop生态相关的云存储和计算等后台开发,喜欢并专注于研究大数据.虚拟化和人工智能等相关技术. 本文档说 ...