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