首页 > 代码库 > UVA 315 求连通图里的割点
UVA 315 求连通图里的割点
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20837
哎 大白书里求割点的模板不好用啊,许多细节理解起来也好烦。。还好找了另一份模板
请注意,这道题里的每组数据都是只有一组连通图的
#include <iostream>#include <cstdio>#include <vector>#include <cstring>using namespace std;const int N = 111;vector<int> g[N];int n, low[N], dfn[N], f[N];bool vis[N];void dfs(int u, int depth, const int &root) { //root为连通图的树根 dfn[u] = low[u] = depth; vis[u] = true; int cnt = 0; for (int i=0; i<g[u].size(); i++) { int v = g[u][i]; if (!vis[v]) { cnt++; dfs(v, depth+1, root); low[u] = min(low[u], low[v]); if (u!=root && low[v]>=dfn[u]) f[u]++; //当u不为树根的时候 if (u==root && cnt>=2) f[u]++; //当u为搜索树的树根的时候 } else low[u] = min(low[u], dfn[v]); }}int cut_point() { dfs(1, 1, 1); int ans = 0; for (int i=1; i<=n; i++) if (f[i] >= 1) ans++; return ans;}void init() { memset(f, 0, sizeof(f)); memset(vis, false, sizeof(vis)); for(int i = 0;i < N;++i) g[i].clear();}int main() { while(scanf("%d",&n)&&n) { init(); int start,v; while(scanf("%d",&start)&&start) { while(getchar()!=‘\n‘) { scanf("%d",&v); g[start].push_back(v); g[v].push_back(start); } } printf("%d\n",cut_point()); } return 0;}
UVA 315 求连通图里的割点
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。