#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int NN=105;
vector<int> adj[NN];
int n,rt,rt_son;
int dfn[NN],low[NN];
bool cut[NN];
void dfs(int u,int dep)
{
dfn[u]=low[u]=dep;
for (int i=0; i<adj[u].size(); i++)
{
int v=adj[u][i];
if (!dfn[v])
{
dfs(v,dep+1);
if (u==rt) rt_son++;
else
{
low[u]=min(low[u],low[v]);
if (low[v]>=dfn[u]) cut[u]=true; //由后继节点搜不到比该点更早的点,则该点是割点
}
}
else low[u]=min(low[u],dfn[v]);
}
}
int main()
{
while (scanf("%d",&n)!=EOF && n)
{
for (int i=1; i<=n; i++) adj[i].clear();
memset(dfn,0,sizeof(dfn));
int u,v;
while (scanf("%d",&u),u)
{
while (getchar()!='\n')
{
scanf("%d",&v);
adj[u].push_back(v);
adj[v].push_back(u);
}
}
rt=1; rt_son=0;
memset(cut,false,sizeof(cut));
dfs(rt,1);
if (rt_son>1) cut[rt]=true; //有两个子树的根是割点
int sum=0;
for (int i=1; i<=n; i++) sum+=cut[i];
printf("%d\n",sum);
}
return 0;
}
POJ1144-求图的割点(裸)
最新推荐文章于 2018-07-18 16:24:13 发布