HDU 5631 Rikka with Graph(并查集)

来源:互联网 发布:官网seo 编辑:程序博客网 时间:2024/05/19 16:33

大意:有n个点n+1条边,问删边并且使图联通。

思路:并查集盘联通,注意就是最多删两条边。(不能建完图在删边,所以,要删的边一定是要建的图,枚举所有的即可)

#include<map>#include<queue>#include<cmath>#include<iostream>#include<cstdio>#include<stack>#include<cstring>#include<algorithm>#define LL __int64#define inf 0x3f3f3f3fconst 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;}
1 0
原创粉丝点击