明明就是判断所有树里面点的个数的最大值,为什么单单线性扫一遍会wa,在合并两子集的函数中累加可以ac,是我理解错了吗,求解答
ac代码:
#include
#include
#include
#include
using namespace std;
const int maxn = 10000005;
int f[maxn];
int sum[maxn];
void Init()
{
for(int i = 1;i <= maxn;i++)
{
f[i] = i;
sum[i] =1;
}
}
int getf(int t)
{
if(f[t] == t)
return t;
else
{
f[t] = getf(f[t]);//状态压缩
return f[t];
}
}
void merge(int u,int v)
{
int t1 = getf(u);
int t2 = getf(v);
if(t1 != t2)
{
f[t2] = t1;
//靠左原则
sum[t1] += sum[t2];
}
}
int main()
{
int n,x,y;
while(~scanf("%d",&n))
{
if(n == 0)
{
cout<<1<
wa代码:
#include
#include
#include
#include
using namespace std;
const int maxn = 10000005;
int f[maxn];
int sum[maxn];
void Init()
{
for(int i = 1;i <= maxn;i++)
f[i] = i;
memset(sum,0,sizeof(sum));
}
int getf(int t)
{
if(f[t] == t)
return t;
else
{
f[t] = getf(f[t]);//状态压缩
return f[t];
}
}
void merge(int u,int v)
{
int t1 = getf(u);
int t2 = getf(v);
if(t1 != t2)
{
f[t2] = t1;
//靠左原则
}
}
int main()
{
int n,x,y;
while(~scanf("%d",&n))
{
if(n == 0)
{
cout<<1<
POJ-1611
#include
#include
using namespace std;
int n,m,k;
int f[30005],sum[30005];
int getf(int u)
{
if(u == f[u])
return u;
else
{
f[u] = getf(f[u]);
return f[u];
}
}
void merge(int u,int v)
{
u = getf(u);
v = getf(v);
if(u != v)
{
f[v] = u;
sum[u] += sum[v];
//靠左
}
}
int main()
{
int p,q;
while(~scanf("%d%d",&n,&m)&&(n||m))
{
for(int i = 0;i < n;i++)
{
f[i] = i;
sum[i] = 1;
}
for(int i = 1;i <= m;i++)
{
scanf("%d",&k);
k--;
scanf("%d",&p);
while(k--)
{
scanf("%d",&q);
merge(p,q);
}
}
printf("%d\n",sum[getf(0)]);//这里的getf(0)不能替换
//成f[0],因为此时还未进行路径压缩
}
return 0;
}