原题:Network
原题大意
求割顶的模板题。
程序代码
#include <iostream>
#include <cstdio>
#include <vector>
#include <sstream>
#include <cstring>
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn = 1e5+5;
vector<int> G[maxn];
int dfs_clock, iscut[maxn], pre[maxn], low[maxn];
int dfs(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 = dfs(v,u);
lowu = min(lowu, lowv);
if(lowv >= pre[u]){
iscut[u] = true;
}
}
else if(pre[v] < pre[u] && v != fa){
lowu = min(pre[v], lowu);
}
}
if(fa < 0 && child == 1) iscut[u] = false;
return lowu;
}
void find_cut(int n){
mem(pre,0);
mem(iscut,0);
dfs_clock = 0;
for(int i = 1; i <= n; i++)
if(!pre[i]) dfs(i,-1);
}
int main(){
int n;
while(scanf("%d",&n)!=EOF&&n){
for(int i = 0; i <= n; i++)G[i].clear();
getchar();
string tmp;
while(getline(cin,tmp)){
int l,r;
stringstream ss(tmp);
ss>>l;
if(!l) break;
while(ss>>r){
G[l].push_back(r);
G[r].push_back(l);
}
}
find_cut(n);
int ans = 0;
for(int i = 1; i <= n; i++){
if(iscut[i])ans++;
}
cout <<ans << "\n";
}
return 0;
}