poj1523 求割点 及 该割点 可以 把该图分成几个连通分量
2013-05-21 12:33
375 查看
思路:当一个几点为割点时必须满足两个基本条件:
情况1: u为根且至少为两颗子树.
情况2:u不为根且存在一个u在深搜树中的子女满足low[v]>=dfn[u],u为父亲v为子女
#include<iostream> #include<algorithm> #include<string.h> #include<list> #include<cstdio> using namespace std; const int Max=1001; int t,v1,v2; list<int>Gra[Max]; int flag,root,sum; int spf[Max]; int low[Max],lab[Max]; int vis[Max]; int MIN(int a,int b) { return a>b?b:a; } void dfs(int pox,int fa) { low[pox]=lab[pox]=sum++; list<int>::iterator it; int counter=0; for(it=Gra[pox].begin(); it!=Gra[pox].end(); it++) { int v=*it; if(!lab[v]) { counter++; dfs(v,pox); low[pox]=MIN(low[pox],low[v]); if(pox==root&&counter>=2||(pox!=root&&low[v]>=lab[pox])) spf[pox]=flag=true; } else if(v!=fa) low[pox]=MIN(low[pox],lab[v]); } } void find(int u) { vis[u]=1; list<int>::iterator it; for(it = Gra[u].begin(); it != Gra[u].end(); it++) if(!vis[*it]) find(*it); } int main() { for(t=1;; t++) { scanf("%d",&v1); if(v1==0) break; for(int i=0; i<Max; i++) Gra[i].clear(); memset(spf,0,sizeof(spf)); memset(low,0,sizeof(low)); memset(lab,0,sizeof(lab)); while(v1!=0) { scanf("%d",&v2); Gra[v1].push_back(v2); Gra[v2].push_back(v1); root=v1; scanf("%d",&v1); } sum=1; flag=false; dfs(root,-1); printf("Network #%d\n", t); if(flag) { for(int i=1; i<Max; i++) { if(spf[i]==0) continue; int cnt=0; memset(vis,0,sizeof(vis)); vis[i]=true; list<int>::iterator it; for(it=Gra[i].begin(); it!=Gra[i].end(); it++) { if(!vis[*it]) { cnt++; find(*it); } } printf(" SPF node %d leaves %d subnets\n", i, cnt); } } else printf(" No SPF nodes\n"); printf("\n"); } return 0; }
相关文章推荐
- soj 3134: windy和水星 Stoer-Wagner算法求无向图的最小割集:一个无向连通网络,去掉一个边集可以使其变成两个连通分量则这个边集就是割集;最小割集当然就权和最小的割集
- Critical Set(删除无向图的一个节点或者两个节点或者三个节点之后有几个连通分量?)
- HDU-用N个三角形最多可以把平面分成几个区域
- HDU 1249 三角形 三角形最多可以把平面分成几个区域? 递推找规律题
- 最小生成树MST的Kruskal算法+并查集(链表实现)划分连通分量和集合,并查集可以保存多个集合
- poj1523求割点以及割后连通分量数tarjan算法应用
- poj1523--C - SPF(连通分量,求割点)
- poj1523求割点以及割后连通分量数tarjan算法应用
- 用N个三角形最多可以把平面分成几个区域
- POJ1523(tarjan割点后,连通分量有多少)
- 用N个三角形最多可以把平面分成几个区域?
- 一些项目——用N个三角形最多可以把平面分成几个区域?
- 数据结构实验:连通分量个数
- HDU1856——最大连通分量的节点个数
- Codeforces Round #286 div.2 D 505D. Mr. Kitayuta's Technology【强连通分量,弱联通分量】
- hdu 1269 tarjan求强连通分量
- IDC将中国城市分成六级:每一级具体的城市是那几个市,谢谢回复
- 有向图强连通分量 Tarjan算法【java实现】
- |Vijos|IOI1996|图论强连通分量|P1595 学校网络
- 1021. Deepest Root (25)-PAT甲级真题(图的遍历,dfs,连通分量的个数)