poj 1144 Network
2015-03-24 11:22
253 查看
题意:给定你一张图,求改图中有几个割点。
分析:直接上tarjan。
AC代码:
分析:直接上tarjan。
AC代码:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; const int maxn = 105; int n; bool edge[maxn][maxn]; int vis[maxn];//for tarjan int low[maxn];//for tarjan int subnet[maxn];// int cnt;//for tarjan int cut; bool input(){ scanf("%d",&n); if(n == 0) return false; //clear for(int i = 0; i <= n; i++){ for(int j = 0; j <= n; j++){ edge[i][j] = false; } } char s[1000]; char *ss; int u,v; int p; gets(s);//清除换行 while(1){ gets(s); ss = s; sscanf(ss,"%d%n",&u,&p); if(u == 0) break; ss += p; while(strlen(ss) > 0){ sscanf(ss,"%d%n",&v,&p); ss += p; edge[u][v] = edge[v][u] = true; } } return true; } void dfs(int u){//tarjan vis[u] = low[u] = ++cnt; for(int v = 1; v <= n; v++){ if(edge[u][v]){ if(!vis[v]){ dfs(v); low[u] = min(low[u],low[v]); if(low[v] >= vis[u]){ subnet[u]++; } } else low[u] = min(low[u],vis[v]); } } } void solve(){ //clear cnt = 0; cut = 0; for(int i = 0; i <= n; i++) { vis[i] = 0; subnet[i] = 0; } dfs(1); if(subnet[1] > 1) cut++; for(int i = 2; i <= n; i++){ if(subnet[i]) cut++; } printf("%d\n",cut); } int main(){ while(input()){ solve(); } 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)
- Network POJ - 1144
- POJ -1144 Network 求割点
- POJ 1144 Network(简单求无向图割顶数)