Comet OJ(Contest #14)-飞翔的小鸟【tarjan】

1|0正题

题目链接:https://www.cometoj.com/contest/73/problem/E?problem_id=4124


1|1题目大意

给出n个点m条边的一张有向图,边有边权,q次询问从点1走到点x的所有路径(可以重复经过任何点包括点x)中极差最大是多少。

1n2×105,1m5×105


1|2解题思路

首先肯定要tarjan缩点,然后考虑怎么统计极差。

考虑到极差其实到某个位置的时候就已经不会再改变了,而且这个到这个位置的路径一定是作为最小值或者最大值的。

所以我们可以维护一个路径上的最大值/最小值和最大极差,然后每次考虑新的转移会不会更新极差就可以了。

时间复杂度:O(n+m)

CometOJ评测机炸了,代码没测就当过了吧...


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> #include<stack> #define mp(x,y) make_pair(x,y) using namespace std; const int N=2e5+10; int n,m,t,cnt,dfn[N],low[N],col[N],in[N]; int mi[N],mx[N],Mi[N],Mx[N],ans[N]; stack<int> s;queue<int> q;bool ins[N]; vector<pair<int,int> > G[N],T[N]; void tarjan(int x){ dfn[x]=low[x]=++cnt; ins[x]=1;s.push(x); for(int i=0;i<G[x].size();i++){ int y=G[x][i].first; if(!dfn[y]){ tarjan(y); low[x]=min(low[x],low[y]); } else if(ins[y]) low[x]=min(low[x],dfn[y]); } if(dfn[x]==low[x]){ while(s.top()!=x){ col[s.top()]=x; ins[s.top()]=0; s.pop(); } col[x]=x;ins[x]=0; s.pop(); } return; } void Topsort(){ for(int i=1;i<=n;i++) if(!in[i])q.push(i); while(!q.empty()){ int x=q.front();q.pop(); Mx[x]=max(Mx[x],mx[x]); Mi[x]=min(Mi[x],mi[x]); ans[x]=max(ans[x],mx[x]-Mi[x]); ans[x]=max(ans[x],Mx[x]-mi[x]); for(int i=0;i<T[x].size();i++){ int y=T[x][i].first,w=T[x][i].second; in[y]--; Mx[y]=max(Mx[y],max(Mx[x],w)); Mi[y]=min(Mi[y],min(Mi[x],w)); ans[y]=max(ans[y],ans[x]); ans[y]=max(ans[y],w-Mi[x]); ans[y]=max(ans[y],Mx[x]-w); if(!in[y])q.push(y); } } return; } int main() { scanf("%d%d%d",&n,&m,&t); for(int i=1;i<=m;i++){ int x,y,w; scanf("%d%d%d",&x,&y,&w); G[x].push_back(mp(y,w)); } tarjan(1); memset(mi,0x3f,sizeof(mi)); memset(Mi,0x3f,sizeof(Mi)); for(int x=1;x<=n;x++){ for(int i=0;i<G[x].size();i++){ int y=G[x][i].first,w=G[x][i].second;y=col[y]; if(col[x]==y)mx[y]=max(mx[y],w),mi[y]=min(mi[y],w); else T[col[x]].push_back(mp(y,w)),in[y]++; } } Topsort(); while(t--){ int x; scanf("%d",&x); if(x==1||!col[x])puts("-1"); else printf("%d\n",ans[col[x]]); } return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15426482.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(40)  评论(3编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示