求割点个数

#include<cstdio>
#include<cstring>
#include<vector> 
#include<algorithm>
#include<cmath>
using namespace std;
vector<int> mp[10010];
int root,low[130],dfn[130],vis[130],num[130],cnt;
void Tarjan(int u){
	low[u] = dfn[u] = ++cnt;
	vis[u] = 1;
	for( int i = 0; i < mp[u].size(); i++){
		int v = mp[u][i];
		if(!vis[v]){
			Tarjan(v);
			low[u] = min(low[u],low[v]);
			if(low[v] >= dfn[u] && u != 1){
				num[u]++;
			} 
			else if(u == 1) root++;
		}
		else{
			low[u] = min(low[u],dfn[v]);
		}
	}
}
int main(){
	int n,u,v;
	while(scanf("%d",&n) && n){
		root = cnt = 0;
		memset(low,0,sizeof(low));
		memset(dfn,0,sizeof(dfn));
		memset(vis,0,sizeof(vis));
		memset(num,0,sizeof(num));
		while(scanf("%d",&u) && u){
			while(getchar() != '\n'){
				scanf("%d",&v);
				mp[u].push_back(v);
				mp[v].push_back(u);
			}
		}
		Tarjan(1);
		for(int i = 1; i <= n; i++)
		if(mp[i].size()) mp[i].clear();
		int ans = 0;
		if(root > 1) ans++;
		for( int i = 2; i <= n; i++)
		if(num[i]) ans++;
		printf("%d\n",ans);
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/sky_zdk/article/details/79617068