洛谷P3388 【模板】割点
tarjan求割点的模板题。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10; 4 int head[N],to[N<<1],nxt[N<<1],tot; 5 int dfn[N],low[N],st[N],top; 6 int cnt,deg[N],idx,n,m;//deg[i]表示i点属于点双的数量 7 vector<int> a[N]; 8 9 void add(int u,int v){ 10 nxt[++tot]=head[u]; 11 head[u]=tot; 12 to[tot]=v; 13 } 14 15 void dfs(int u,int fa){ 16 low[u]=dfn[u]=++cnt; 17 st[++top]=u; 18 for(int i=head[u];i;i=nxt[i]){ 19 int v=to[i],vv; 20 if(v!=fa){ 21 if(!dfn[v]){ 22 dfs(v,u); 23 low[u]=min(low[u],low[v]); 24 if(low[v]>=dfn[u]){//找到新的点双 25 idx++; 26 a[idx].push_back(u); 27 deg[u]++; 28 do{ 29 vv=st[top--]; 30 a[idx].push_back(vv); 31 deg[vv]++; 32 }while(vv!=v); 33 } 34 } 35 else low[u]=min(low[u],dfn[v]); 36 } 37 } 38 } 39 40 int main(){ 41 scanf("%d%d",&n,&m); 42 while(m--){ 43 int a,b; 44 scanf("%d%d",&a,&b); 45 add(a,b);add(b,a); 46 } 47 for(int i=1;i<=n;i++) 48 if(!dfn[i]){ 49 dfs(i,0); 50 top=0; 51 } 52 int ans=0; 53 for(int i=1;i<=n;i++) 54 ans+=deg[i]>1;//deg值>1的点是割点 55 printf("%d\n",ans);//割点个数 56 for(int i=1;i<=n;i++) 57 if(deg[i]>1) printf("%d ",i); 58 59 /*for(int i=1;i<=idx;i++){ 输出每个点双的点编号 60 printf("%d:",i); 61 for(int j=0;j<a[i].size();j++) 62 printf("%d",a[i][j]); 63 printf("\n"); 64 }*/ 65 }
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
标签:
tarjan
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析