正题

题目链接:https://www.luogu.com.cn/problem/CF757F


题目大意

\(n\)个点\(m\)条边的一张无向图,求删除\(s\)以外的一个点改变\(s\)到最多点的最短路。


解题思路

挺裸的一道题的,首先肯定要跑一遍最短路搞出最短路树。

然后如果最短路树上\(s\)到某个点的路径被割掉了就会改变最短路长度,所以直接求出支配树然后看除了根以外最大子树的子节点就好了。

时间复杂度\(O(m\log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define mp(x,y) make_pair(x,y)
using namespace std;
const ll N=3e5+10,T=19;
priority_queue<pair<ll,ll>> q;
struct node{
ll to,next,w;
}a[N*2];
ll n,m,s,tot,ls[N],dis[N],dep[N],v[N];
ll head,tail,top[N],f[N][T+1],siz[N];
void addl(ll x,ll y,ll w){
a[++tot].to=y;
a[tot].next=ls[x];
ls[x]=tot;a[tot].w=w;
return;
}
void dij(){
memset(dis,0x3f,sizeof(dis));
dis[s]=0;q.push(mp(0,s));
while(!q.empty()){
ll x=q.top().second;q.pop();
if(v[x])continue;v[x]=1;
for(ll i=ls[x];i;i=a[i].next){
ll y=a[i].to;
if(dis[x]+a[i].w<dis[y]){
dis[y]=dis[x]+a[i].w;
q.push(mp(-dis[y],y));
}
}
}
return;
}
ll LCA(ll x,ll y){
if(dep[x]>dep[y])swap(x,y);
for(ll i=T;i>=0;i--)
if(dep[f[y][i]]>=dep[x])
y=f[y][i];
if(x==y)return x;
for(ll i=T;i>=0;i--)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][0];
}
void build(){
head=1;tail=1;top[1]=s;
memset(v,0,sizeof(v));
for(ll x=1;x<=n;x++)
for(ll i=ls[x];i;i=a[i].next)
if(dis[x]+a[i].w==dis[a[i].to])
v[a[i].to]++;
while(head<=tail){
ll x=top[head++];
dep[x]=dep[f[x][0]]+1;
for(ll i=1;i<=T;i++)
f[x][i]=f[f[x][i-1]][i-1];
for(ll i=ls[x];i;i=a[i].next){
ll y=a[i].to;
if(dis[x]+a[i].w!=dis[y])continue;
v[y]--;
if(!f[y][0])f[y][0]=x;
else f[y][0]=LCA(f[y][0],x);
if(!v[y])top[++tail]=y;
}
}
return;
}
signed main()
{
scanf("%lld%lld%lld",&n,&m,&s);
for(ll i=1;i<=m;i++){
ll x,y,w;
scanf("%lld%lld%lld",&x,&y,&w);
addl(x,y,w);addl(y,x,w);
}
dij();
build();ll ans=0;
for(ll i=tail;i>1;i--){
siz[top[i]]++,siz[f[top[i]][0]]+=siz[top[i]];
ans=max(ans,siz[top[i]]);
}
printf("%lld\n",ans);
}

CF757F-Team Rocket Rises Again【最短路,DAG支配树】的更多相关文章

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

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

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

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

  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. codeforces757F Team Rocket Rises Again【支配树+倍增+拓扑+spfa】

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

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

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

  7. codeforces 757F - 最短路DAG+灭绝树

    Description 给定一个n个点,m条边的带权无向图,和起点S.请你选择一个点u(u!=S),使得在图中删掉点u 后,有尽可能多的点到S的最短距离改变. Solution 先建出最短路DAG,在 ...

  8. luogu2597-[ZJOI2012]灾难 && DAG支配树

    Description P2597 [ZJOI2012]灾难 - 洛谷 | 计算机科学教育新生态 Solution 根据题意建图, 新建一个 \(S\) 点, 连向每个没有入边的点. 定义每个点 \( ...

  9. codeforces 757F Team Rocket Rises Again

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

随机推荐

  1. input 限制 上传文件类型

    参考:input file控件限制上传文件类型 HTML <input> 标签的 accept 属性 网页上添加一个input file HTML控件: <input id=&quo ...

  2. nginx 部署vue

    server { listen 80; server_name localhost; root /www/meiduo_admin/dist; access_log /var/log/nginx/ad ...

  3. COM笔记-CoCreateInstance

    CoCreateInstance 创建组件的最简单的方法是使用CoCreateInstance函数. 在COM库中包含一个用于创建组件的名为CoCreateInstance的函数.此函数需要一个CLS ...

  4. Java常用类之时间类

    JDK8之前日期时间API 1. java.lang.System类 2. java.util.Date类 3. java.text.SimpleDateFormat类 4. java.util.Ca ...

  5. vue3.0入门(一)

    前言 最近在b站上学习了飞哥的vue教程 学习案例已上传,下载地址 使用方式 使用在线cdn 下载js文件并自托管,引入到项目后使用 使用npm安装后,用cli来构建项目 声明式渲染 Vue2需引入v ...

  6. 微信支付 调用支付jsapi缺少参数total_fee 和 支付验证签名失败 prepay_id配置问题

    =======================================================先熟悉一下统一下单api所需要的参数=========================== ...

  7. 设置 Qt GUI程序 printf输出到独立控制台

  8. AWS扩容EC2实例根空间

    文章原文 aws 端操作 先在EC2 实例中选中磁盘 然后打开跟设备 修改大小后保存 ec2 端操作 lsblk 查看当前设备的磁盘编号 df -T -H 查看扩容前的空间大小并确定磁盘格式 grow ...

  9. Linux下用Sed查找IP地址

    ip addr|sed -n '9p'|egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|sed -nr 's#^.*inet (.*) b ...

  10. kali linux 的基本命令

    Kali Linux 命令集 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2)uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统 ...