http://poj.org/problem?id=1144
题意:求割点的个数。
裸模板。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 110;
int dfn[N],low[N];
bool cut[N];
int rt ,rt_num,dep;
vector<int> vet[N];
void dfs(int u)
{
dfn[u] = low[u] = ++dep;
for(int i=0; i<vet[u].size();i++)
{
int v = vet[u][i];
if(!dfn[v])
{
dfs(v);
if(u==rt) rt_num++;
else
{
low[u] = min(low[u],low[v]);
if(low[v] >= dfn[u]) cut[u] = true;
}
}
else low[u] = min(low[u],dfn[v]);
}
return;
}
int main()
{
//freopen("data.in","r",stdin);
int n;
while(scanf("%d",&n)!=EOF && n)
{
for(int i=1;i<=n;i++) vet[i].clear();
int x,y; char ch;
while(scanf("%d",&x)!=EOF && x)
{
while(scanf("%d%c",&y,&ch)!=EOF)
{
vet[x].push_back(y);
vet[y].push_back(x);
if(ch=='\n')
break;
}
}
rt = 1, rt_num = 0;
memset(dfn,0,sizeof(dfn));
memset(cut,false,sizeof(cut));
dfs(1);
int ans = 0;
dep = 0;
if(rt_num>1) cut[rt]=true;
for(int i=1;i<=n;i++)
if(cut[i]) ans++;
cout<<ans<<endl;
}
return 0;
}