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

1|0正题

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


1|1题目大意

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


1|2解题思路

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

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

时间复杂度O(mlogn)


1|3code

#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); }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14285416.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(170)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示