codeforces757F Team Rocket Rises Again【支配树+倍增+拓扑+spfa】
先跑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;
int n,m,s,h[N],cnt,fa[N],sz[N],ans,to[N],si[N],hs[N],de[N],fr[N],b[N],tot,d[N],f[N][20];
long long dis[N];
bool v[N];
vector<int>a[N];
struct qwe
{
int ne,to,va;
}e[N<<1];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v,int w)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
e[cnt].va=w;
h[u]=cnt;
}
int lca(int x,int y)
{//cerr<<" "<<x<<" "<<y<<endl;
if(de[x]<de[y])
swap(x,y);
for(int i=18;i>=0;i--)
if(de[f[x][i]]>=de[y])
x=f[x][i];
if(x==y)
return x;//cerr<<" "<<x<<" "<<y<<endl;
for(int i=18;i>=0;i--)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];//cerr<<x<<" "<<y<<endl;
return f[x][0];
}
void dfs(int u)
{
sz[u]=1;
for(int i=h[u];i;i=e[i].ne)
{
dfs(e[i].to);
sz[u]+=sz[e[i].to];
}
}
int main()
{
n=read(),m=read(),s=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read(),z=read();
add(x,y,z),add(y,x,z);
}
queue<int>q;
for(int i=1;i<=n;i++)
dis[i]=1e18;
dis[s]=0;
v[s]=1;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
v[u]=0;
for(int i=h[u];i;i=e[i].ne)
if(dis[e[i].to]>dis[u]+e[i].va)
{
dis[e[i].to]=dis[u]+e[i].va;
if(!v[e[i].to])
{
v[e[i].to]=1;
q.push(e[i].to);
}
}
}
for(int u=1;u<=n;u++)
for(int i=h[u];i;i=e[i].ne)
if(dis[e[i].to]+e[i].va==dis[u])
a[u].push_back(e[i].to);
memset(h,0,sizeof(h));
cnt=0;
for(int u=1;u<=n;u++)
for(int i=0,len=a[u].size();i<len;i++)
add(a[u][i],u,0),d[u]++;
q.push(s);
de[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
b[++tot]=u;
if(a[u].size())
f[u][0]=a[u][0];//cerr<<u<<" "<<f[u][0]<<" ";
for(int i=1,len=a[u].size();i<len;i++)
f[u][0]=lca(f[u][0],a[u][i]);//cerr<<f[u][0]<<endl;
de[u]=de[f[u][0]]+1;
for(int i=1;i<=18;i++)
f[u][i]=f[f[u][i-1]][i-1];
for(int i=h[u];i;i=e[i].ne)
if(!(--d[e[i].to]))
q.push(e[i].to),f[e[i].to][0]=u;
}//cerr<<lca(3,6)<<endl;
// for(int i=1;i<=n;i++)
// {
// for(int j=0;j<5;j++)
// cerr<<f[i][j]<<" ";
// cerr<<endl;
// }
memset(h,0,sizeof(h));
cnt=0;
for(int i=1;i<=n;i++)
if(f[i][0])
add(f[i][0],i,0);//,cerr<<f[i][0]<<" "<<i<<endl;
dfs(s);
for(int i=1;i<=n;i++)
if(i!=s)
ans=max(ans,sz[i]);
printf("%d\n",ans);
return 0;
}
codeforces757F Team Rocket Rises Again【支配树+倍增+拓扑+spfa】的更多相关文章
- CF757F Team Rocket Rises Again——最短路+支配树
CF757F Team Rocket Rises Again 全体起立,全体起立,这是我A的第一道黑题(虽然是CF的): 来一波番茄攻击: 不扯淡了,这道题也是学习支配树(之前)应该做的题: 和灾难不 ...
- cf757F Team Rocket Rises Again (dijkstra+支配树)
我也想要皮卡丘 跑一遍dijkstra,可以建出一个最短路DAG(从S到任意点的路径都是最短路),然后可以在上面建支配树 并不会支配树,只能简单口胡一下在DAG上的做法 建出来的支配树中,某点的祖先集 ...
- 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\),使得 ...
- codeforces 757F Team Rocket Rises Again
链接:http://codeforces.com/problemset/problem/757/F 正解:灭绝树. mdzz倍增lca的根节点深度必须是1..我因为这个错误调了好久. 我们考虑先求最短 ...
- CF757F Team Rocket Rises Again
题意 建出最短路图(DAG)之后就跟这题一样了. code: #include<bits/stdc++.h> using namespace std; #define int long l ...
- CF757F-Team Rocket Rises Again【最短路,DAG支配树】
正题 题目链接:https://www.luogu.com.cn/problem/CF757F 题目大意 \(n\)个点\(m\)条边的一张无向图,求删除\(s\)以外的一个点改变\(s\)到最多点的 ...
- luogu2597-[ZJOI2012]灾难 && DAG支配树
Description P2597 [ZJOI2012]灾难 - 洛谷 | 计算机科学教育新生态 Solution 根据题意建图, 新建一个 \(S\) 点, 连向每个没有入边的点. 定义每个点 \( ...
- 康复计划#4 快速构造支配树的Lengauer-Tarjan算法
本篇口胡写给我自己这样的老是证错东西的口胡选手 以及那些想学支配树,又不想啃论文原文的人- 大概会讲的东西是求支配树时需要用到的一些性质,以及构造支配树的算法实现- 最后讲一下把只有路径压缩的并查集卡 ...
随机推荐
- debug x86 汇编程序指南
--------------------------------------------------------------------------------------------------- ...
- linux撤销命令
u撤销上一步操作 ctrl+r恢复上一步被撤销的操作
- view上下抖动特效
shake.xml <?xml version="1.0" encoding="utf-8"?> <translate xmlns:andro ...
- Maven简介(五)——pom.xml
6 Maven的pom.xml介绍 6.1 简介 pom.xml文件是Maven进行工作的主要配置文件.在这个文件中我们可以配置Maven项目的groupId.artifactId ...
- American Heritage usaco
基础题,主要思路是找到根,然后分别递归即可: #include<iostream> #include<cstring> #include<string> #incl ...
- 简洁多用途SuperSlide插件—tab标签样式
简洁多用途SuperSlide插件—tab标签切换代码样式,由huiyi8素材网提供. 源码:http://www.huiyi8.com/tab/
- Java企业微信开发_10_未验证域名归属,JS-SDK功能受限
1.现象: 在企业微信后台填写可信域名后,提示:未验证域名归属,JS-SDK功能受限,如下图: 点击“申请域名校验”后, 注意:域名根目录 当时一直不清楚这个域名根目录在哪里,最后让我给试出来了 2. ...
- ubuntu的root权限设置
Linux操作系统有root权限用户和普通权限用户两种模式. 在执行一些需要权限才能执行的任务时,我们需要转化到root权限用户条件下才能执行. 1.普通用户权限转临时root权限: Linux中,通 ...
- 华为机试 可怕的N阶乘
题目标题: 计算阶乘n!是一件可怕的事情,因为当n并不是很大时,n!将是一个很大的值.例如13! = 6227020800,已经超过了我们常用的unsigned int类型的取值范围.请设计一个程序, ...
- static修饰类的作用
Java里面static一般用来修饰成员变量或函数.但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以.被static修饰的内部类可以直接作为一个普通类来使用,而 ...