圆方树
1.【算法学习】排序2.【算法学习】Manacher 马拉车3.【算法学习】KMP 算法4.LCA 最近公共祖先(树链和倍增)这次真有树链了!!!5.线段覆盖问题6.【算法学习】学换根dp有感7.二分图最大匹配8.【算法学习】01BFS9.洛谷 P1892 [BOI2003] 团伙 种类并查集 扩展域并查集10.【算法学习】高斯消元法11.贝叶斯公式12.背包13.【算法学习】模拟退火14.【算法学习】基环树15.【算法学习】树链部分16.【算法学习】莫队17.【算法学习】分块九讲18.平衡树
19.圆方树
20.【算法学习】点分治21.公式22.【算法学习】笛卡尔树23.【算法学习】悬线法24.欧几里得算法与 EX25.【算法学习】逆元与求解26.【算法学习】费马定理27.三分28.裴蜀定理29.【算法学习】欧拉函数φ30.【算法学习】二维转一维问题31.【算法学习】扫描线32.【算法学习】矩阵乘法33.【算法学习】同余最短路34.【算法学习】组合数学35.【算法学习】反悔贪心兔已经讲的非常好了,我就讲我的理解吧!!!
大多数情况下,图论是比树结构要复杂多的,所以引入了一个圆方树的一种数据结构。
把无向图转化为由原点与点双连通分量组成的树,原图的每一个点都是一个圆点,每一个点双都是一个方点,所以形成的新图有 \(n+c\) 个点,每个点双转为方点时形成一个菊花图。
我直接上代码!!
-
要从新图上建边建点。
-
cnt 要初始化为 n。
-
注意退栈操作,最后记住把top退出。
点击查看代码
#include<bits/stdc++.h> using namespace std; const int N=400005; #define ll long long int n; int s,t; vector<int> v[N],a[N]; int low[N],dfn[N],top=0,st[N],cnt,tot; void tarjan(int x){ low[x]=dfn[x]=++tot; st[++top]=x; for(int y:v[x]){ if(!dfn[y]){ tarjan(y); low[x]=min(low[x],low[y]); if(low[y]==dfn[x]){ ++cnt; for(int b=0;b!=y;--top){ b=st[top]; a[cnt].push_back(b); a[b].push_back(cnt); } a[cnt].push_back(x); a[x].push_back(cnt); } } else{ low[x]=min(low[x],dfn[y]); } } } signed main(){ ios::sync_with_stdio(false); cin>>n>>m; cnt=n; for(int i=1;i<=m;i++){ cin>>u>>vv; v[u].push_back(vv); v[vv].push_back(u); } for(int i=1;i<=n;i++){ if(!dfn[i]){ tarjan(i); top--; } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)