当前位置: 首页 > news >正文

P3916 图的遍历(Tarjan缩点和反向建边)

 P3916 图的遍历 - 洛谷 | 计算机科学教育新生态

写法一:Tarjan

思路:先运用Tarjan算法得到每个连通块中最大的编号,然后对每个连通块进行缩点重新建图,进行dfs,得到缩点后的连通块能够达到的最大编号。

Code:


constexpr int N=1e5+5,mod=1e9+7;int a[N],dfn[N],stk[N],low[N],top,scc[N],cnt,tot;
int n,m,instack[N],ma[N],sz[N];
bool st[N];
int x[N],y[N];
vector<int> e[N],g[N];void Tarjan(int u)
{stk[++top]=u,instack[u]=1;low[u]=dfn[u]=++tot;for(auto t:e[u]){if(!dfn[t]){Tarjan(t);low[u]=min(low[u],low[t]);}else if(instack[t]) low[u]=min(low[u],dfn[t]);}if(low[u]==dfn[u]){cnt++; int y;//cout<<"____"<<cnt<<' '<<u<<endl;do{y=stk[top--]; instack[y]=0;scc[y]=cnt;// cout<<"____"<<cnt<<' '<<y<<endl;ma[cnt]=max(ma[cnt],y);}while(u!=y);}
}void dfs(int u)
{if(a[u]) return ;a[u]=ma[u];// cout<<u<<' '<<a[u]<<' '<<g[u].size()<<endl;for(auto t:g[u]){if(!a[t]){dfs(t);}a[u]=max(a[u],a[t]);// cout<<u<<' '<<t<<' '<<a[u]<<endl;}
}
void solve()
{cin>>n>>m;for(int i=0;i<m;i++){cin>>x[i]>>y[i];e[x[i]].push_back(y[i]);}for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i);for(int i=0;i<m;i++){if(scc[x[i]]==scc[y[i]]) continue;g[scc[x[i]]].push_back(scc[y[i]]);}for(int i=1;i<=cnt;i++){if(!a[i]) dfs(i);}for(int i=1;i<=n;i++)cout<<a[scc[i]]<<' ';
}

写法二:反向建图

既然要计算每个点能走到的最大编号,我们可以直接从大编号 开始搜索与它关联的路径,该路径上的点均为大编号。

Code:

constexpr int N=1e5+5,mod=1e9+7;int a[N],n,m;
vector<int> e[N];void dfs(int u,int i)
{if(a[u]) return ;a[u]=i;for(auto t:e[u]){if(!a[t]){dfs(t,i);}}}
void solve()
{cin>>n>>m;for(int i=1;i<=m;i++){int a,b;cin>>a>>b;e[b].push_back(a);}for(int i=n;i;i--)if(!a[i]) dfs(i,i);for(int i=1;i<=n;i++) cout<<a[i]<<' ';
}

http://www.lryc.cn/news/496827.html

相关文章:

  • Android13 允许桌面自动旋转
  • cocotb value cocotb—基础语法对照篇
  • 001-SpringBoot整合日志
  • 【Java基础面试题011】什么是Java中的自动装箱和拆箱?
  • ERROR in [eslint] Invalid Options ‘extensions‘ has been removed.
  • 消息传递神经网络(Message Passing Neural Networks, MPNN)
  • 常用图像变换方法
  • 从被动响应到主动帮助,ProActive Agent开启人机交互新篇章
  • 力扣hot100道【贪心算法后续解题方法心得】(三)
  • 工业齐套管理虚拟现实仿真模拟软件
  • ARP表、MAC表、路由表的区别和各自作用
  • Android 使用OpenGLES + MediaPlayer 获取视频截图
  • 浏览器的事件循环机制
  • Z2400032基于Java+Mysql+SSM的校园在线点餐系统的设计与实现 代码 论文
  • k8s使用的nfs作为sc。
  • linux下Qt程序部署教程
  • tp6 合成两个pdf文件(附加pdf或者替换pdf)
  • 工作:三菱PLC防止程序存储器爆满方法
  • jmeter 获取唯一全局变量及多线程读写的问题
  • 掌握 Spring Boot 中的缓存:技术和最佳实践
  • 动手学深度学习10.5. 多头注意力-笔记练习(PyTorch)
  • 13 设计模式之外观模式(家庭影院案例)
  • 单片机学习笔记 12. 定时/计数器_定时
  • Web安全基础实践
  • Zookeeper集群数据是如何同步的?
  • SpringCloud框架学习(第六部分:Sentinel实现熔断与限流)
  • 动态规划-----路径问题
  • Rust循环引用与多线程并发
  • 东方隐侠网安瞭望台第8期
  • 底部导航栏新增功能按键