HDU 5631 Rikka with Graph(并查集)

大意:有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;
}

你可能感兴趣的:(并查集)