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算法
本篇口胡写给我自己这样的老是证错东西的口胡选手 以及那些想学支配树,又不想啃论文原文的人- 大概会讲的东西是求支配树时需要用到的一些性质,以及构造支配树的算法实现- 最后讲一下把只有路径压缩的并查集卡 ...
随机推荐
- 《CSS权威指南(第三版)》---第四章 值和单位
本章主要讲解的是一些属性声明用的值: CSS中的值主要有数字,百分数,颜色, 1.颜色: rgb(100%,100%,100%) OR rgb(255,255,255) OR #FF0000 WE ...
- c语言学习的第13天2
#include <stdio.h> #include <malloc.h> void f(int **q) { *q=(int *)malloc(sizeof(int)); ...
- mooc_java 集合框架中 学生所选课程2Map&HashMap
Map&HashMapMap提供映射关系,元素以键值对形式存储,Map的键值对一Entry类型的对象实例形式存在,key值不能重复,value可以键最多能映射到一个值,支持泛型 Map< ...
- 详解Java异常Throwable、Error、Exception、RuntimeException的区别
在Java中,根据错误性质将运行错误分为两类:错误和异常. 在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象.生成的异常对象将传递Java运行时系统,这一异常的产生和提交过程称为抛 ...
- html5--1.4元素的属性
html5--1.4元素的属性 学习要点: 1.了解HTML元素属性2.学习两个属性:align和bgcolor 属性的作用就是就为元素提供更多的信息,大多数元素都可以拥有属性 属性的语法:<标 ...
- 勤于思考:IE10不支持检测IE6的代码
这句话 var isIE6 = isIE && ([/MSIE (\d)\.0/i.exec(navigator.userAgent)][0][1] == 6); 在IE6~9都没问题 ...
- 小程序js页面设置上导航颜色
//导航条颜色更改 wx.setNavigationBarColor({ frontColor: '#ffffff', // 必写项 backgroundColor: '#008de6', // 必写 ...
- WEB攻击之 CSRF 攻击及防御策略
介绍 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法. 释义: 跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如 ...
- mysql客户首末单时间 group by用法_20160927
一.取用户第一次下单时间 SELECT city,username,`order_date` AS 首单日期,金额 AS 首单金额 FROM ( SELECT city,username,`order ...
- ACM学习历程—BestCoder 2015百度之星资格赛1002 列变位法解密(vector容器)
Problem Description 列变位法是古典密码算法中变位加密的一种方法,具体过程如下 将明文字符分割成个数固定的分组(如5个一组,5即为密钥),按一组一行的次序整齐排列,最后不足一组不放置 ...