hdu5631--暴力+并查集

思路:n最大才100,一共n+1条边,最多删去两条边会使图仍然连通,所有遍历所有删去一条边和两条边的情况

#include <cstdio>
#include <iostream>
using namespace std;
const int N = 105;
int u[N],v[N],fa[N];
int n,ans,cnt;
int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int x,int y){
	int fx = find(x);
	int fy = find(y);
	if(fx != fy){
		fa[fx] = fy;
		cnt--;
	} 
}
int main(){
	int t;scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		ans = 0;
		for(int i = 0;i <= n;i++) scanf("%d%d",u+i,v+i);
		//删去一条边或两条边
		for(int i = 0;i <= n;i++){
			for(int j = i;j <= n;j++){
				for(int k = 0;k <= n;k++) fa[k]=k;
				cnt = n;
				for(int k = 0;k <= n;k++){
					if(k == i||k == j) continue;
					merge(u[k],v[k]);
				}
				if(cnt == 1) ans++;
			} 
		} 
		printf("%d\n",ans);
	}
	return 0;
} 
发布了27 篇原创文章 · 获赞 0 · 访问量 348

猜你喜欢

转载自blog.csdn.net/weixin_44083561/article/details/104100270
今日推荐