大意:有n个点n+1条边,问删边并且使图联通。
思路:并查集盘联通,注意就是最多删两条边。(不能建完图在删边,所以,要删的边一定是要建的图,枚举所有的即可)
#include<map>
#include<queue>
#include<cmath>
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
#define LL __int64
#define inf 0x3f3f3f3f
const double PI=acos(-1.0);
using namespace std;
int f[500],mp[500][500];
struct node{
int a,b;
}q[500];
int fi(int x){
return x==f[x]?x:f[x]=fi(f[x]);
}
void mer(int a,int b){
int x=fi(a);
int y=fi(b);
if(x>y){
f[x]=y;
}
else
f[y]=x;
}
int main(){
int n,m,i,j,k,cla;
scanf("%d",&cla);
while(cla--){
//memset(mp,0,sizeof(mp));
scanf("%d",&n);
for(i=0;i<=n;i++){
scanf("%d%d",&q[i].a,&q[i].b);
}
int ans=0;
int x,y;
for(i=0;i<=n;i++){
for(j=i;j<=n;j++){
for(k=1;k<=n;k++)
f[k]=k;
for(k=0;k<=n;k++){
if(k==i||k==j)
continue;
mer(q[k].a,q[k].b);
//printf("%d %d\n",q[k].a,q[k].b);
}
int tmp=0;
for(k=1;k<=n;k++){
if(f[k]==k)
tmp++;
//printf("%d %d\n",k,f[k]);
}
if(tmp==1)
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}