今天学了并查集,一脸蒙逼回顾一下。
大题思路:初始化pre[i]=i;输入关系,寻找祖先,如果祖先相同,为同一分支,若祖先不同,合并,防止重复计算。
int main()
{
while(scanf("%d",&n)&&n)//多组输入,控制循环结束
for(int i=0;i<n;i++)
pre[i]=i;//初始化pre数组
scanf("%d",&m);
while(m--)
{
scanf("%d %d",&r1,&r2);
p1=find(r1);
p2=find(r2);//找祖先
if(p1!=p2)
pre[p2]=p1;//如果祖先不相等,合并,防止重复计算。
..........//根据题意找到合适的语句
}
int find(int x)
{int r=x;
while(pre[r]!=r)
r=pre[r];//寻找祖先,如果上级还有的pre不等于自己说明上级还有上级,继续寻找,相当于pre[pre[r]]
int i=x,j;
if(i!=r)
{j=pre[i];
pre[i]=r;
i=j;//缩短路径**
}
return r;
}
}