我的思路就是把有血缘关系的当做一个家族,那么这个家族里面的人就代表了同一种数字,我用的是最小数,然后进行比较,如果相等的话就说明是同一个家族,但是只有20分,求调
#include<bits/stdc++.h>
using namespace std;
long long a[11451411],x[114514][2],d;
int main(){
long long n,m,s;
cin>>n>>m>>s;
for(int i = 1;i<=n;i++) a[i]=i;
for(int i = 1;i<=m;i++){cin>>x[i][0]>>x[i][1];if(x[i][0]>x[i][1]) swap(x[i][0],x[i][1]);}//排序,小的在左大的在右
for(int i = 1;i<=m;i++)
for(int j = i;j<=m;j++)
if(x[j][0]<x[i][0]) swap(x[j],x[i]);//排序,让每个家族代表的数字都是这个家族最小的
for(int i = 1;i<=m;i++){
d=max(a[x[i][0]],a[x[i][1]]);//找出两个亲人中间比较大的数,设小
a[x[i][0]]==min(a[x[i][0]],a[x[i][1]]);//把两个数送进同一个家族,取小的数为代号
a[x[i][1]]==min(a[x[i][0]],a[x[i][1]]);
for(int j = 1;j<=n;j++)
if(a[j]==d) a[j]=a[x[i][0]];//找出大的数d的家族,把他们合并进小的数的家族
}
/*for(int i = 1;i<=n;i++) cout<<a[i]<<' ';*/ //这一行是我来检查家族合并情况的
for(int i = 1;i<=s;i++){
long long c,b;
cin>>c>>b;
if(a[c]==a[b])cout<<"Yes"<<endl;//如果两个数相等就说明被我们放入了同一个家族,有血缘关系
else cout<<"No"<<endl;
}
}
玄关