CF757F-Team Rocket Rises Again【最短路,DAG支配树】
正题
题目链接: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支配树】的更多相关文章
- CF757F Team Rocket Rises Again——最短路+支配树
CF757F Team Rocket Rises Again 全体起立,全体起立,这是我A的第一道黑题(虽然是CF的): 来一波番茄攻击: 不扯淡了,这道题也是学习支配树(之前)应该做的题: 和灾难不 ...
- cf757F Team Rocket Rises Again (dijkstra+支配树)
我也想要皮卡丘 跑一遍dijkstra,可以建出一个最短路DAG(从S到任意点的路径都是最短路),然后可以在上面建支配树 并不会支配树,只能简单口胡一下在DAG上的做法 建出来的支配树中,某点的祖先集 ...
- CF757F Team Rocket Rises Again
题意 建出最短路图(DAG)之后就跟这题一样了. code: #include<bits/stdc++.h> using namespace std; #define int long l ...
- 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 ...
- codeforces757F Team Rocket Rises Again【支配树+倍增+拓扑+spfa】
先跑spfa求出最短路构成的DAG,然后在DAG上跑出支配树dfs出size取max即可 关于支配树,因为是DAG,支配点就是入点在支配树上的lca,所以一边拓扑一边预处理倍增,然后用倍增求lca # ...
- Solution -「CF 757F」Team Rocket Rises Again
\(\mathcal{Description}\) link. 给定 \(n\) 个点 \(m\) 条边的无向图和一个源点 \(s\).要求删除一个不同与 \(s\) 的结点 \(u\),使得 ...
- codeforces 757F - 最短路DAG+灭绝树
Description 给定一个n个点,m条边的带权无向图,和起点S.请你选择一个点u(u!=S),使得在图中删掉点u 后,有尽可能多的点到S的最短距离改变. Solution 先建出最短路DAG,在 ...
- luogu2597-[ZJOI2012]灾难 && DAG支配树
Description P2597 [ZJOI2012]灾难 - 洛谷 | 计算机科学教育新生态 Solution 根据题意建图, 新建一个 \(S\) 点, 连向每个没有入边的点. 定义每个点 \( ...
- codeforces 757F Team Rocket Rises Again
链接:http://codeforces.com/problemset/problem/757/F 正解:灭绝树. mdzz倍增lca的根节点深度必须是1..我因为这个错误调了好久. 我们考虑先求最短 ...
随机推荐
- input 限制 上传文件类型
参考:input file控件限制上传文件类型 HTML <input> 标签的 accept 属性 网页上添加一个input file HTML控件: <input id=&quo ...
- nginx 部署vue
server { listen 80; server_name localhost; root /www/meiduo_admin/dist; access_log /var/log/nginx/ad ...
- COM笔记-CoCreateInstance
CoCreateInstance 创建组件的最简单的方法是使用CoCreateInstance函数. 在COM库中包含一个用于创建组件的名为CoCreateInstance的函数.此函数需要一个CLS ...
- Java常用类之时间类
JDK8之前日期时间API 1. java.lang.System类 2. java.util.Date类 3. java.text.SimpleDateFormat类 4. java.util.Ca ...
- vue3.0入门(一)
前言 最近在b站上学习了飞哥的vue教程 学习案例已上传,下载地址 使用方式 使用在线cdn 下载js文件并自托管,引入到项目后使用 使用npm安装后,用cli来构建项目 声明式渲染 Vue2需引入v ...
- 微信支付 调用支付jsapi缺少参数total_fee 和 支付验证签名失败 prepay_id配置问题
=======================================================先熟悉一下统一下单api所需要的参数=========================== ...
- 设置 Qt GUI程序 printf输出到独立控制台
- AWS扩容EC2实例根空间
文章原文 aws 端操作 先在EC2 实例中选中磁盘 然后打开跟设备 修改大小后保存 ec2 端操作 lsblk 查看当前设备的磁盘编号 df -T -H 查看扩容前的空间大小并确定磁盘格式 grow ...
- 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 ...
- kali linux 的基本命令
Kali Linux 命令集 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2)uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统 ...