来源:点击打开链接
更加标准的模板题,几乎所有OIER和ACMER的培训上都讲过类似的例子,什么配对强盗然后看分几波。。配对敌人看看有几方势力。。配对物品发现有几种。。之类的云云,一概属于并查集。。。再去看看状态压缩。。ORORZ。。我看的课件是OIER的PAS版。。。。。。。。。。高中生IMBA
#include <cstring>
#include <iostream>
#include <stdio.h>
using namespace std;
int student[50005];
int search(int tar)
{
int result=tar;
while(result!=student[result])
result=student[result];
return result;
}
void merge(int a,int b)
{
int ka=search(a);
int kb=search(b);
if(ka!=kb)
{
student[ka]=kb;
}
}
int main()
{
int people,relation;
int test=1;
while(scanf("%d%d",&people,&relation) && (people!=0 ||relation!=0))
{
for(int k=0;k<=people;k++)
{
student[k]=k;
}
int region=0;
for(int i=1;i<=relation;i++)
{
int a,b;
scanf("%d%d",&a,&b);
merge(a,b);
}
for(int j=1;j<=people;j++)
{
if(student[j]==j)
region++;
}
cout<<"Case "<<test<<": "<<region<<endl;
test++;
}
return 0;
}