您的位置:首页 > 其它

HDU5631(并查集)

2016-02-24 14:17 204 查看
题目大意: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: