POJ 1523 SPF(割点所割连通分量数)
来源:互联网 发布:铭万网的合作伙伴网络 编辑:程序博客网 时间:2024/04/29 18:28
POJ 1523 SPF(割点所割连通分量数)
http://poj.org/problem?id=1523
题意:
给你一个无向图,问你该图中有多少割点.且每个割点能把该图分为几个连通分量
分析:
本题与POJ 2117很类似,也是用cut[i]数组来计数i节点所能割的儿子数.(不过注意:对于根节点,如果它不是割点,那么cut[i]==0而不是-1了),具体分析完全可以参考POJ 2117:
http://blog.csdn.net/u013480600/article/details/30976823
注意:该题中只有真正的割点其cut值才非0,如果i点不是割点.那么cut[i]==0.(不会存在-1的情况)
对于非根节点的割点,它能分割图为cut[i]+1个连通分量,对于根节点割点,它能分割图为cut[i]个连通分量
AC代码:
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int maxn= 1000+10;vector<int> G[maxn], ans;int pre[maxn],cut[maxn],low[maxn];int dfs_clock;int tarjan(int u,int fa){ int lowu=pre[u]=++dfs_clock; int child=0; for(int i=0;i<G[u].size();i++) { int v=G[u][i]; if(!pre[v]) { child++; int lowv=tarjan(v,u); lowu=min(lowv,lowu); if(lowv>=pre[u]) cut[u]++; } else if(pre[v]<pre[u] && v!=fa) lowu=min(lowu,pre[v]); } if(fa<0)//根 { if(child>=2) ans.push_back(u); } else if(cut[u]>=1) ans.push_back(u),cut[u]++; //非根割点,所分连通分量还要+1 return low[u]=lowu;}int main(){ int u,v; int kase=1; while(scanf("%d",&u)==1&&u) { dfs_clock=0; memset(pre,0,sizeof(pre)); memset(cut,0,sizeof(cut)); ans.clear(); for(int i=1;i<=1000;i++) G[i].clear(); while(true) { scanf("%d",&v); G[u].push_back(v); G[v].push_back(u); scanf("%d",&u); if(u==0) break; } for(int i=1;i<=1000;i++)if(pre[i]==0 && G[i].size()>0) { tarjan(i,-1); } sort(&ans[0],&ans[0]+ans.size()); if(ans.size()>0) { printf("Network #%d\n",kase++); for(int i=0;i<ans.size();i++) printf(" SPF node %d leaves %d subnets\n",ans[i],cut[ans[i]]); } else printf("Network #%d\n No SPF nodes\n",kase++); puts(""); //别忘了这个回车 } return 0;}
0 0
- POJ 1523 SPF(割点所割连通分量数)
- POJ 1523 SPF(割点所割连通分量数)
- POJ 1523 SPF(割点所割连通分量数)
- [割点] poj 1523 SPF
- POJ-1523 SPF 割点
- 【POJ】1523 SPF 割点
- POJ - 1523 SPF(割点)
- POJ--1523 SPF(割点)
- POJ 1523 SPF【割点】
- POJ 1523 SPF 割点
- POJ 1523 SPF (割点)
- Poj 1523 SPF(割点 + tarjan算法)
- TOJ 2018 POJ 1523 SPF / 割点
- POJ 1523 SPF(割点)
- POJ-1523 SPF (割点[Tarjan])
- POJ 1523 SPF (割点)
- POJ 1523 SPF 割边与割点
- 割点、割边、强连通分量
- C# 模拟按键
- 编程基础知识——Java JNI开发流程(1)
- 豆瓣客户端的实现03
- VMWARE虚拟机不能上网三种方法分析
- LINUX core文件
- POJ 1523 SPF(割点所割连通分量数)
- Linux 常用快捷键
- NYOJ-477 A+B Problem III
- 使用 DB2 UDB OLAP 函数
- C++11 新特性之 tuple
- duiLib : 修改DuiDesigner, 增强选择元素后的用户体验
- 画廊的应用2
- javascript的exec()、test()、compile()用法
- ODBC编程