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算法
本篇口胡写给我自己这样的老是证错东西的口胡选手 以及那些想学支配树,又不想啃论文原文的人- 大概会讲的东西是求支配树时需要用到的一些性质,以及构造支配树的算法实现- 最后讲一下把只有路径压缩的并查集卡 ...
随机推荐
- python基础教程_学习笔记11:魔法方法、属性和迭代器
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/31417309 魔法方法.属性和迭代器 在pyth ...
- Linux下监视GPU、CPU的使用情况
1.在运行Tensorflow等程序时会使用到NVIDIA的GPU,所以在程序运行时需要监控GPU的运行情况 使用 nvidia-smi 命令 ,显示如下: nvidia-smi 显示解读: GPU: ...
- 深刻理解render 和 redirect_to
深刻理解render 和 redirect_to http://www.blogjava.net/fl1429/archive/2009/03/12/259403.html 由于最近老是在表单提交后出 ...
- cetons 怎么强制卸载 PHP
查看php版本命令: #php -v 这个命令是删除不干净的 #yum remove php 因为使用这个命令以后再用 #php -v 还是会看到有版本信息的..... 必须强制删除 #rpm -qa ...
- DOM的构建与优化
一.构建模块 HTML描述了一个页面的结构.浏览器会将它转换成一种他们能够理解的格式——文档对象模型(DOM),浏览器引擎有一段特殊的代码叫做解析器,将数据从一种格式转换成另外一种格式. 一个HTML ...
- CodeForces - 540D Bad Luck Island —— 求概率
题目链接:https://vjudge.net/contest/226823#problem/D The Bad Luck Island is inhabited by three kinds of ...
- Spring Boot2.0之整合log4j
传统方式打印日志比较复杂, 每次打印需要定义全局变量 private static final Logger logger = LoggerFactory.getLogger(SjpControlle ...
- zabbix simple check
摘自: http://www.ttlsa.com/zabbix/zabbix-simple-checks/ 1. 开始 Simple checks通常用来检查远程未安装代理或者客户端的服务 使用sim ...
- 时尚设计div+css免费模板
时尚设计div+css免费网页模板,时尚设计,div+css. http://www.huiyi8.com/moban/
- Cocos2d-x中单例的使用
大家都知道一个程序中只有一个导演类,eg: CCDirector *pDirectory = CCDirector::sharedDirector();//初始化导演类. 可通过 pDirectory ...