POJ 1144 Network 割点
http://poj.org/problem?id=1144
题意:给出一个连通图,求割点的个数
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#define nMAX 105
using namespace std;
int map[nMAX][nMAX],dfn[nMAX],low[nMAX];
int times,root,n;
bool flag[nMAX];
int min(int a,int b)
{
return a<b?a:b;
}
void tarjan(int u,int fa)
{
int son=0;
low[u]=dfn[u]=++times;
for(int v=1;v<=n;v++)
{
if(!map[u][v])continue;
if(!dfn[v])
{
son++;
tarjan(v,u);
low[u]=min(low[u],low[v]);
if((u==root&&son>=2)||(u!=root&&dfn[u]<=low[v]))
{
flag[u]=1;
}
}
else if(v!=fa)low[u]=min(low[u],dfn[v]);
}
}
void init()
{
times=0;
memset(map,0,sizeof(map));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(flag,0,sizeof(flag));
}
int main()
{
int i,j;
while(~scanf("%d",&n)&&n)
{
init();
while(~scanf("%d",&i)&&i)
{
while(getchar()!='\n')
{
scanf("%d",&j);
map[i][j]=map[j][i]=1;
}
}
root=1;
tarjan(1,-1);
int ans=0;
for(i=1;i<=n;i++)
if(flag[i])ans++;
printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号