poj 1144 Network
2015-02-22 10:49
316 查看
无向图的割顶
定义
割点:对于无向图G,如果删除某个点u后,连通分量数目增加,u就是图的割点。对于连通图,割点就是删除之后使图不再连通的点。时间戳:记录结点访问顺序的变量。
树边:dfs森林中的边。
反向边:第一次处理从后代指向祖先的边。
是割顶的条件(连通图)
1.树根:子结点数目>=22.非树根u:u存在一个子结点v,使得v及其所有后代都没有反向边连回u的祖先(连回u不算)
求解割点(计算low函数)
设low(u)是u及其后代所能连回的最早的祖先的pre值,u是割点等价于,low(v) >= pre(u),意思是v及其后代所能回溯到的最早的祖先是u的祖先的后代,证明v及其后代不能连回u的祖先,即u是割顶。下面给出求解low函数的code:int DFS(int u, int fa){//fa是u的祖先(起始fa应为负数) int lowu = pre[u] = ++dfs_clock; int child = 0;//记录根节点的后代数 for(int i=0; i<vt[u].size(); i++){ int v = vt[u][i]; if(!pre[v]){ child++; int lowv = DFS(v, u);//dfs的结果是low函数的值 lowu = min(lowu, lowv);//用后代的low更新u的low函数 if(lowv >= pre[u]) iscut[u] = true; } else if(pre[v] < pre[u] && v != fa)//先访问v且v不是u的祖先证明这是反向边 lowu = min(lowu, pre[v]); } if(fa < 0 && child == 1) iscut[u] = false;//判断根节点是否是割点 low[u] = lowu;//由于割顶成立的条件不止一次成立,所以不要边判定边输出 return lowu; }
例题(poj 1144)
裸的求割点题目代码如下:
#include <queue> #include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; vector <int> vt[110]; int low[110],pre[110],dfs_clock; bool iscut[110]; void init(){ dfs_clock = 0; for(int i=0; i<100; i++){ vt[i].clear(); low[i] = 0; pre[i] = 0; iscut[i] = false; } } int DFS(int u, int fa){ int lowu = pre[u] = ++dfs_clock; int child = 0; for(int i=0; i<vt[u].size(); i++){ int v = vt[u][i]; if(!pre[v]){ child++; int lowv = DFS(v, u); lowu = min(lowu, lowv); if(lowv >= pre[u]) iscut[u] = true; } else if(pre[v] < pre[u] && v != fa) lowu = min(lowu, pre[v]); } if(fa < 0 && child == 1) iscut[u] = false; low[u] = lowu; return lowu; } int n; int main(){ while(scanf("%d",&n) && n){ init(); int u; while(scanf("%d",&u) && u){ int v; while(getchar() != '\n'){ scanf("%d",&v); vt[u].push_back(v); vt[v].push_back(u); } } int tmp = DFS(1, -1); int ans = 0; for(int i=1; i<=n; i++) if(iscut[i]) ans++; printf("%d\n",ans); } return 0; }
相关文章推荐
- 【poj1144】 Network
- poj1144 Network 双连通分量
- poj 1144 Network 无向连通图求割点
- poj 1144 Network (无向图求割点)
- [POJ1144]Network
- POJ 1144 Network (割顶)
- POJ 1144 Network
- POJ 1144 - Network 用tarjan求无向图的割点
- POJ 1144 Network(Tarjan)
- POJ-1144 Network 求割点
- poj1144-Network
- [poj1144]Network(求割点模板)
- 【poj1144】 Network
- POJ 1144 / ZOJ 1311 : Network - 割点个数
- POJ 1144 Network 求割点个数
- POJ1144——Network
- POJ 1144 Network(Tarjan)
- 【连通图|割点】POJ-1144 Network
- Network POJ - 1144
- POJ -1144 Network 求割点