点双连通分量的求解 Tarjan算法的拓展
来源:互联网 发布:图书销售软件 编辑:程序博客网 时间:2024/05/20 02:23
问题描述:
给出一张连通的无向图 输出图中的所有连通分量
代码:
#include<iostream>#include<cstdio>#include<cstring>#define maxn 1050using namespace std;struct node{ int from,to,next,vis; int equall(node b) { if((from==b.from)&&to==b.to||(from==b.to&&to==b.from)) return 1; return 0; }}edge[maxn*100],Edge; //int head[maxn]; //邻接表 int e_num; //int dfn[maxn],low[maxn];int num;node stk[maxn*100];int top;int ss;void init(){ memset(head,-1,sizeof(head)); memset(dfn,0,sizeof(dfn)); num=1; e_num=0; top=-1; ss=0;}void addedge(int a,int b){ edge[e_num]={a,b,head[a],0}; head[a]=e_num++; edge[e_num]={b,a,head[b],0}; head[b]=e_num++;}void Tarjan(int u){ dfn[u]=low[u]=num++; for(int i=head[u];i!=-1;i=edge[i].next) { if(!edge[i].vis) { edge[i].vis=edge[i^1].vis=1; //防止回边(同一条边)重复入栈 stk[++top]=edge[i]; //压栈 int v=edge[i].to; if(!dfn[v]) { Tarjan(v); low[u]=min(low[u],low[v]); if(dfn[u]<=low[v]) //发现u是割点 -----构成一个连通分量 { printf("连通分量%d:\n",++ss); while(1) { if(top<0) break; printf("%d-%d ",stk[top].from,stk[top].to); top--; if(edge[i].equall(stk[top+1])) break; } cout<<endl; } } else low[u]=min(low[u],dfn[v]); } }}int main(){ int n,m; int a,b; while(1) { printf("请输入点数和边数:\n"); scanf("%d%d",&n,&m); init(); for(int i=1;i<=m;i++) { printf("请输入第%d条边:\n",i); scanf("%d%d",&a,&b); addedge(a,b); } Tarjan(1); } return 0;}
0 0
- 点双连通分量的求解 Tarjan算法的拓展
- tarjan求点的双连通分量
- TARJAN的求双连通分量算法
- 点/边 双连通分量---Tarjan算法
- 【tarjan求解双连通分量】
- 双连通分量的求解
- tarjan算法(边的双连通分量)
- [双连通分量] tarjan算法
- tarjan算法-双连通分量
- 关于Tarjan算法求点双连通分量
- tarjan算法应用 割点 桥 双连通分量
- tarjan算法应用 割点 桥 双连通分量
- tarjan算法应用 割点 桥 双连通分量
- POJ1523 SPF【点双连通分量】【Tarjan】
- BZOJ1123 BLO [Tarjan][点双连通分量]
- POJ 2942 点的双连通分量
- 点的双连通分量问题
- Tarjan双连通分量算法论文翻译
- 敏捷开发中的10大错误认识
- C# Deflate 压缩与解压缩
- 在PyCharm里配置SubVersion
- 锐评:手游安全破“黑”行动
- zBar扫描二维码时闪光灯自动打开问题
- 点双连通分量的求解 Tarjan算法的拓展
- C3P0数据库连接池的配置
- C# post数据时 出现如下错误: System.Net.WebException: 操作超时
- [Objective-C] Categories 小例子
- iOS UINavigationController跳转到指定页面
- 自定义标签
- java实习日记三
- [iOS]创建单一像素的分割线
- 视频截图一无编解码截图