HDU5631(并查集)

来源:互联网 发布:网络借贷平台推广渠道 编辑:程序博客网 时间:2024/06/08 02:09

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

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

#include <cstdio>#include <algorithm>#include <cstring>#include <iostream>#include <cmath>#include <string>using namespace std;int fa[111];int from[111], to[111];int n;void init(){    for(int i=0; i<=n; i++)    {        fa[i] = i;    }}int find_fa(int x){    return fa[x] == x ? fa[x] : fa[x] = find_fa(fa[x]);}int main(){    int T;    scanf("%d", &T);    while(T--)    {        scanf("%d", &n);        for(int i=0; i<=n; i++)        {            scanf("%d%d", &from[i], &to[i]);        }        int sum;        int ans = 0;        for(int i=0; i<=n; i++)        {            sum = n;            init();            for(int j=0; j<=n; j++)            {                if(j != i)                {                    int fx = find_fa(from[j]);                    int fy = find_fa(to[j]);                    if(fx != fy)                    {                        fa[fx] = fy;                        sum--;                    }                }            }            if(sum == 1)                ans++;        }        for(int i=0; i<=n; i++)        {            for(int j=i+1; j<=n; j++)            {                init();                sum = n;                for(int k=0; k<=n; k++)                {                    if(k != i && k != j)                    {                        int fx = find_fa(from[k]);                        int fy = find_fa(to[k]);                        if(fx != fy)                        {                            fa[fx] = fy;                            sum--;                        }                    }                }                if(sum == 1)                    ans++;            }        }        printf("%d\n", ans);    }    return 0;}


0 0
原创粉丝点击