Network |
---|
题意: 求出无向图中的割点数量
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
#define _for(i, a, b) for(int i = (a); i <= (b); ++i)
const int N = 110;
int n, dfn, cut[N];
int num[N], low[N];
vector<int> G[N];
void dfs(int u, int fa) {
num[u] = low[u] = ++dfn;
int child = 0;
for(auto v : G[u]) {
if(!num[v]) {
child++;
dfs(v, u);
low[u] = min(low[u], low[v]);
if(low[v] >= num[u] && fa != -1) cut[u] = 1;
} else if(num[v] < num[u] && v != fa) low[u] = min(low[u], num[v]);
}
if(fa == -1 & child > 1) cut[u] = 1;
}
int tarjan() {
int ans = 0;
_for(i, 1, n) cut[i] = num[i] = low[i] = dfn = 0;
_for(i, 1, n) if(!num[i]) dfs(i, -1);
_for(i, 1, n) ans += cut[i];
return ans;
}
void input() {
int u, v;
for(int i = 1; i <= n; i++) G[i].clear();
while(~scanf("%d", &u) && u)
while(~scanf("%d", &v)) {
G[u].push_back(v);
G[v].push_back(u);
if(getchar() == '\n') break;
}
}
int main() {
while(~scanf("%d", &n) && n) {
input();
printf("%d\n", tarjan());
}
return 0;
}