并查集:
前段时间在网上学了并查集,感觉自己对于写递归代码不大熟悉,现在重新写了一遍,巩固一下自己的知识。这次编码自己加入了文件来存储输入数据,减少自己的测试工作量。
#include <stdio.h>
#include <stdlib.h>
void init(int d[])//初始化
{
int i;
for(i=1;i<=100;i++)
{
d[i]=i;
}
}
int find(int x,int d[])//查找前驱同时压缩路径
{
if(x!=d[x])
{
find(d[x],d);
d[x]=d[d[x]];
}
return d[x];
}
int main()
{
int d[101];
init(d);
FILE *fp;
fp=fopen("data.txt","r");
int count1;//存在关系的两数对
int a,b;
fscanf(fp,"%d",&count1);
while(count1)
{
fscanf(fp,"%d%d",&a,&b);
printf("%d %d\n",a,b);
d[b]=a;//将第一个数作为第二个数的父节点
count1--;
}
printf("\n");
int count2;//待查询关系的两数对
fscanf(fp,"%d",&count2);
while(count2)
{
fscanf(fp,"%d%d",&a,&b);
printf("!%d %d!\n",a,b);
a=find(a,d);
b=find(b,d);
printf(" **%d %d**\n",a,b);
if(a==b)
{
printf("是\n");
}
else
{
printf("否\n");
}
count2--;
}
return 0;
}
在文件中输入:
5
1 2
2 3
3 4
4 5
5 6
10
3 2
6 5
1 3
2 1
4 5
2 3
3 2
5 6
6 5
4 3
3 4
输出: