为什么第二次数据会错

在某个江湖中,相互认识的人会加入同一个门派,而互不认识的人不会加入相同的门派。若甲认识乙,且乙认识丙,那么甲和丙就算是认识的。对于给定的认识关系,请计算共有多少个门派,人数最多的门派有多少人。【输入格式:】首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试首先输入两个整数n、m(1≤n≤1000,1≤m≤n(n-1)/2),n表示总人数,m表示认识关系数。然后输入m行,每行两个整数A、B(1≤A,B≤1000,且A!=B),表示编号为A、B的两人互相认识。【输出格式:】对于每组测试,输出门派总数和人数最多的门派拥有的人数。
输入样例:2
5 3
1 2
2 3
4 5
5 1
2 5
输出样例:
2 3
4 2
代码:
#include
using namespace std;
int a[1002];
int b[1002];
int findx(int x)
{
int r = x;
while (a[r] != r)
r = a[r];
return r;
}
void merge(int x, int y)
{
int fx, fy;
fx = findx(x);
fy = findx(y);
if (fx != fy)
a[fx] = fy;
}
int height(int x)
{
if (x == a[x])
return x;
return a[x] = height(a[x]);
}
int main()
{
int n, m, i, x, y, count, j, k, s;
scanf_s("%d", &j);
for (k = 0;k < j;k++)
{
scanf_s("%d", &n);
for (i = 1;i <= n;i++)
{
a[i] = i;
}
for (scanf_s("%d", &m);m > 0;m--)
{
scanf_s("%d %d", &x, &y);
merge(x, y);
}
for (count = 0, i = 1;i <= n;i++)
{
b[height(i)]++;
if (a[i] == i)
count++;
}
for (i = 1;i <= n;i++)
{
s = max(s, b[i]);
}
printf("%d %d\n", count, s);
}
return 0;
}
运营结果:

img


为什么第二次数据会错

a和b不要用全局变量
非要用全局变量的话,那每到一个新的组你要清零啊

感觉你会的东西好多呀!有没有好的学习方法呢?