USTC机试-从给定的无向图顶点对文件中读出定点信息确定最大连通分量输入另一个文件中
//in.txt中保存如下信息,7位边的个数
7
1 2
1 3
2 4
2 5
3 4
3 5
6 7
1 2
1 3
2 4
2 5
3 4
3 5
6 7
//out.txt中保存输出结果,如下
//完整代码如下,输入 文件请自行创建
//从一个邻接结点对文件中读出无向图的信息,向另一个文件输出最大连通分量的定点
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define N 100
using namespace std;
int Tree[N];//保存根节点记录
int findRoot(int id){//并查集思想寻找一个结点的父节点
if(Tree[id]==-1) return id;//自己就是根节点
else{/*此处是重点*/
int temp=findRoot(Tree[id]);
Tree[id]=temp;//更新根节点
return temp;
}
}
int main(){
FILE *fp1,*fp2;
int a,b;//保存依次读入的顶点对
int sum[N];//保存该根节点所在的连通分量个数
fp1=fopen("in.txt","r");
fp2=fopen("out.txt","w");
int n;//读取第一行路径数
for(int i=1;i<N;i++){
Tree[i]=-1;//初始化均为独立根节点
sum[i]=1;//初始联通分量个数均是1
}
fscanf(fp1,"%d",&n);//标准化读入数字赋值给n
while(!feof(fp1)){
fscanf(fp1,"%d",&a);
fscanf(fp1,"%d",&b);
a=findRoot(a);
b=findRoot(b);//寻找两个节点的根节点
if(a!=b){//如果根节点不同则合并并查集
Tree[a]=b;//此处还可以设置累加变量记录连通分量个数
sum[b]+=sum[a];
}
}
int max=1;//记录最大连通分量的个数
int max_id;//记录最大连通分量时的根节点id
for(i=1;i<=n;i++){//一趟for循环找出最大连通分量的个数及其根节点id
if(Tree[i]==-1){
if(sum[i]>max){
max=sum[i];
max_id=i;
}
}
}
int record[N];
int j=0;
for(i=1;i<=n;i++){
if(findRoot(i)==max_id)record[j++]=i;
}
record[j]=max_id;//将自身也加入记录
//下面开始写入文件
sort(record,record+max);//升序排列
for(i=0;i<max;i++)
fprintf(fp2,"%d ",record[i]);
fclose(fp1);
fclose(fp2);
return 0;
}
1 2 3 4 5