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..我因为这个错误调了好久. 我们考虑先求最短 ...
 
随机推荐
- C++程序调试方式总结
			
bug调试要根据应用场景和条件,选择什么样子的调试方式很大程度上不是你想选择什么样的调试方式,而是还剩下什么样子的调试方式可用.下面就根据不同的场景和条件来总结一下. 目录: 1.gdb调试或者IDE ...
 - [源码解析] 深度学习流水线并行 GPipe(3) ----重计算
			
[源码解析] 深度学习流水线并行 GPipe(3) ----重计算 目录 [源码解析] 深度学习流水线并行 GPipe(3) ----重计算 0x00 摘要 0x01 概述 1.1 前文回顾 1.2 ...
 - T-SQL - query01_创建数据库|创建表|添加数据|简单查询
			
时间:2017-09-29 整理:byzqy 本篇以"梁山好汉花名册"为例,记录MS SQLServer T-SQL语句的使用,包含命令: 创建数据库 | 删除数据库 创建表 | ...
 - linux centos7 增加操作日志记录
			
2021-08-24 1. 需求产生原因 linux 系统中的日志存放在目录 /var/log/ 下,今天想看看我之前的操作记录,发现系统中的日志并不包括各个用户操作文件的记录,所以打算自己建一个. ...
 - Python - 面向对象编程 - super()
			
前置知识 继承的详解:https://www.cnblogs.com/poloyy/p/15216652.html 子类方法的重写:https://www.cnblogs.com/poloyy/p/1 ...
 - 云原生学习筑基 ~ 组网必备知识点 ~ DNS服务
			
@ 目录 一.为啥写这篇文章? 二.DNS的作用 三.域 四.DNS工作原理 五.搭建DNS服务器 5.1.Bind 5.2.系统环境准备 5.3.安装 5.4.查看bind的相关文件 5.5.查看b ...
 - yield表达式 python语法
			
可以先看下这篇文章:http://www.cnblogs.com/jiangtu/articles/6662043.html 原篇是转载的:http://www.python-tab.com/html ...
 - C# 爬虫框架实现 流程_各个类开发
			
目录链接:C# 爬虫框架实现 概述 对比通用爬虫结构,我将自己写的爬虫分为五个类实现: Spider主类:负责设置爬虫的各项属性 Scheduler类:负责提供URL到下载类,接收URL并做去重 Do ...
 - noip模拟题7
			
目录 T1:匹配 T2:回家 思路 上代码: T3:寿司 基本思路: 上代码: T1:匹配 ##思路: 首先,这道题既可以用KMP,也可以用hash 先说KMP,首先要注意的一点是:KMP的n ...
 - 常见GDB命令