#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
const int maxn=105;
int dfsn[maxn],low[maxn],cnt=0;
int iscut[maxn],par[maxn];
vector<int> g[maxn];
void tarjan(int u,int fa)
{
par[u]=fa;
dfsn[u]=low[u]=++cnt;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(!dfsn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
}
else{
if(fa!=v){
low[u]=min(low[u],dfsn[v]);
}
}
}
}
int main()
{
int n;
while(scanf("%d",&n)&&n){
for(int i=1;i<=n;i++){
g[i].clear();
}
int a;
while(scanf("%d",&a)&&a){
while(getchar()!='\n'){
int b;
scanf("%d",&b);
g[a].push_back(b);
g[b].push_back(a);
}
}
memset(dfsn,0,sizeof(dfsn));
memset(low,0,sizeof(low));
memset(iscut,0,sizeof(iscut));
memset(par,0,sizeof(par));
cnt=0;
tarjan(1,0);
int root=0;
for(int i=2;i<=n;i++){
int u=par[i];
if(u==1){
root++;
}
else
if(low[i]>=dfsn[u]){
iscut[u]=1;
}
}
if(root>1){
iscut[1]=1;
}
int ans=0;
for(int i=1;i<=n;i++){
if(iscut[i])++ans;
}
printf("%d\n",ans);
}
return 0;
}
Network UVA - 315(求缩点)
最新推荐文章于 2021-02-24 23:47:18 发布