题意:众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的:给出一张 n 个点 n+1 条边的无向图,你可以选择一些边(至少一条)删除。现在勇太想知道有多少种方案使得删除之后图依然联通。当然,这个问题对于萌萌哒六花来说实在是太难了,你可以帮帮她吗?
思路:让 n 个点联通最少需要 n−1 条边,所以最多只能删除两条边,我们可以枚举删除的这两条边(或者唯一的一条边),然后暴力BFS判断连通性就好了。时间复杂度 O(n3)O(n^3)O(n3)。
问题:刚开始数组开101,一直WA,原来有n+1条边,所以至少得开102;
代码:
#include<stdio.h>
#include<string.h>
int aa[105];
int find(int tt)
{
if(tt!=aa[tt])
aa[tt]=find(aa[tt]);
return aa[tt];
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,s=0;
int a[105],b[105];
scanf("%d",&n);
int i,j,k;
for(i=1;i<=n+1;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
for(i=1;i<=n+1;i++)
{
for(j=i;j<=n+1;j++)
{
for(int zz=1;zz<=n;zz++)
aa[zz]=zz;
int ans=0;
for(k=1;k<=n+1;k++)
{
if(k==j||k==i)
continue;
int zx=find(a[k]);
int zy=find(b[k]);
aa[zx]=zy;
}
for(k=1;k<=n;k++)
if(aa[k]==k)
ans++;
if(ans==1)
s++;
}
}
printf("%d\n",s);
}
}