HDU 5631 Rikka with Graph 求从n+1 边中删除一些边使图依然联通

点击打开链接

题目大意:n个顶点,n+1条边,问删除几个边之后仍是连通图的方案数有多少?

思路:如果图连通的话,只能删1~2条边,而且题目数据小,所以暴力就好。

<span id="transmark"></span>#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<set>
#define PI acos(-1)
#define eps 0.00000001
using namespace std;
struct node
{
    int x,y;
}a[1000];
int bin[10000],n;
void init()
{
    for(int i=0;i<=n;i++)
        bin[i]=i;
}
int Find(int x)
{
    return x==bin[x]?x:bin[x]=Find(bin[x]);
}
void Union(int x,int y)
{
    int fx=Find(x);
    int fy=Find(y);
    if(fx!=fy)
        bin[fx]=fy;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=0;i<=n;i++)
        {
            scanf("%d%d",&a[i].x,&a[i].y);
        }
        int num=0;
        for(int i=0;i<=n;i++)
        {
            init();
            int top=0;
            for(int j=0;j<=n;j++)
            {
                if(i==j)
                continue;
                Union(a[j].x,a[j].y);
            }
            for(int j=1;j<=n;j++)
                if(bin[j]==j)
                 top++;
            if(top==1)
                num++;
        }
        for(int i=0;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                init();
                int top=0;
                for(int k=0;k<=n;k++)
                {
                    if(k==i||k==j)
                        continue;
                    Union(a[k].x,a[k].y);
                }
                for(int k=1;k<=n;k++)
                    if(bin[k]==k)
                    top++;
                if(top==1)
                    num++;
            }
        }
        printf("%d\n",num);
    }
    return 0;
}


你可能感兴趣的:(HDU 5631 Rikka with Graph 求从n+1 边中删除一些边使图依然联通)