我也想要皮卡丘

跑一遍dijkstra,可以建出一个最短路DAG(从S到任意点的路径都是最短路),然后可以在上面建支配树

并不会支配树,只能简单口胡一下在DAG上的做法

建出来的支配树中,某点的祖先集就是从S到该点的必经点集,也就是说,炸掉某点,这个子树都会变得angryunhappy

大概就是按拓扑序来建这个树,每条边(u,v)是要把fa[v]=lca(u,fa[v]),等到v的入度为零时,再用最终的fa[v]连到v上,然后给v做以后求lca时倍增的预处理

最后dfs算出来除S点的最大的子树大小就是答案

 #include<bits/stdc++.h>
#define pa pair<ll,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=2e5+,maxm=3e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Edge{
int a,b,l,ne;
}eg[maxm*];
int egh[maxn],ect;
int N,M,S;
int fa[maxn][],bro[maxn],sh[maxn],dep[maxn];
int siz[maxn],ans,ine[maxn];
ll dis[maxn];
priority_queue<pa,vector<pa>,greater<pa> > q;
queue<int> q2;
bool flag[maxn]; inline void adeg(int a,int b,int c){
eg[++ect].a=a;eg[ect].b=b;eg[ect].l=c;
eg[ect].ne=egh[a];egh[a]=ect;
} inline void dijkstra(){
CLR(dis,);
dis[S]=;q.push(make_pair(,S));
while(!q.empty()){
int p=q.top().second;q.pop();
if(flag[p]) continue;
flag[p]=;
for(int i=egh[p];i;i=eg[i].ne){
int b=eg[i].b;
if(dis[b]>dis[p]+eg[i].l){
dis[b]=dis[p]+eg[i].l;
q.push(make_pair(dis[b],b));
}
}
}
} int getlca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=log2(dep[x]-dep[y]);i>=&&dep[x]!=dep[y];i--){
if(fa[x][i]&&dep[fa[x][i]]>=dep[y])
x=fa[x][i];
}
if(x==y) return x;
for(int i=log2(dep[x]);i>=;i--){
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
}
return fa[x][];
} void dfs(int x){
siz[x]=;
for(int i=sh[x];i;i=bro[i]){
dfs(i);
siz[x]+=siz[i];
}
if(x!=S) ans=max(ans,siz[x]);
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),M=rd();S=rd();
for(i=;i<=M;i++){
int a=rd(),b=rd(),c=rd();
adeg(a,b,c);adeg(b,a,c);
}
dijkstra();
for(i=;i<=ect;i++){
int a=eg[i].a,b=eg[i].b;
if(dis[a]+eg[i].l==dis[b]){
ine[b]++;
}
}
q2.push(S);dep[S]=;
while(!q2.empty()){
int p=q2.front();q2.pop();
for(i=egh[p];i;i=eg[i].ne){
int b=eg[i].b;
if(eg[i].l+dis[p]==dis[b]){
fa[b][]=fa[b][]?getlca(p,fa[b][]):p;
ine[b]--;
if(!ine[b]){
dep[b]=dep[fa[b][]]+;
for(j=;fa[b][j]&&fa[fa[b][j]];j++)
fa[b][j+]=fa[fa[b][j]][j];
q2.push(b);
}
}
}
}
for(i=;i<=N;i++){
// printf("%d %d\n",i,fa[i][0]);
if(i==S||!fa[i][]) continue;
bro[i]=sh[fa[i][]],sh[fa[i][]]=i;
}
dfs(S);
printf("%d\n",ans);
return ;
}

cf757F Team Rocket Rises Again (dijkstra+支配树)的更多相关文章

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

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

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

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

  3. CF757F Team Rocket Rises Again

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

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

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

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

  6. codeforces 757F Team Rocket Rises Again

    链接:http://codeforces.com/problemset/problem/757/F 正解:灭绝树. mdzz倍增lca的根节点深度必须是1..我因为这个错误调了好久. 我们考虑先求最短 ...

  7. CF757F-Team Rocket Rises Again【最短路,DAG支配树】

    正题 题目链接:https://www.luogu.com.cn/problem/CF757F 题目大意 \(n\)个点\(m\)条边的一张无向图,求删除\(s\)以外的一个点改变\(s\)到最多点的 ...

  8. 康复计划#4 快速构造支配树的Lengauer-Tarjan算法

    本篇口胡写给我自己这样的老是证错东西的口胡选手 以及那些想学支配树,又不想啃论文原文的人- 大概会讲的东西是求支配树时需要用到的一些性质,以及构造支配树的算法实现- 最后讲一下把只有路径压缩的并查集卡 ...

  9. [HDU]4694 Important Sisters(支配树)

    支配树模板 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...

随机推荐

  1. JavaScript 利用 async await 实现 sleep 效果

    const sleep = (timeountMS) => new Promise((resolve) => { setTimeout(resolve, timeountMS); }); ...

  2. Linux下针对服务器网卡流量和磁盘的监控脚本

    1)实时监控网卡流量的通用脚本: [root@ceph-node1 ~]# cat /root/net_monit.sh #!/bin/bash PATH=/bin:/usr/bin:/sbin:/u ...

  3. Redis+Keepalived高可用环境部署记录

    Keepalived 实现VRRP(虚拟路由冗余)协议,从路由级别实现VIP切换,可以完全避免类似heartbeat脑裂问题,可以很好的实现主从.主备.互备方案,尤其是无状态业务,有状态业务就需要额外 ...

  4. Docker网络解决方案 - Calico部署记录

    简单来说,实现docker跨主机容器间通信,常用的第三方网络方案是Flannel,Weave,Calico:Flannel会为每个host分配一个subnet,容器从这个subnet中分配ip,这些i ...

  5. this.$http.post ||this.$http.put||vue 获取url参

    getClasslist() { this.$http.get('/xxxxx/childlist', { params: { ServiceUnitId: localStorage.getItem( ...

  6. 个人github链接及git学习心得总结

    个人github链接 https://www.github.com/liangjianming/test git学习心得总结​ git是一个快速,开源,分布式的版本控制系统. GitHub是一个基于w ...

  7. java中实现全局变量的功能

    一.通过接口实现 二.通过静态变量  static声明 package test.autorun; import java.util.LinkedList; import java.util.Queu ...

  8. varnish页面缓存服务

    varnish页面缓存服务 https://www.cnblogs.com/L-dongf/p/9310144.html http://blog.51cto.com/xinzong/1782669 阅 ...

  9. Flask-论坛开发-4-知识点补充

    对Flask感兴趣的,可以看下这个视频教程:http://study.163.com/course/courseLearn.htm?courseId=1004091002 1. WTForms 表单使 ...

  10. Vue中常用的三种传值方式

    父传子 父子组件的关系可以总结为prop向下传递,事件向上传递.父组件通过prop给子组件下发数据,子组件通过事件给父组件发送消息. 父组件: <template> <div> ...