【专题复习5:并查集】1107、1114、1118
1107
i号同学:喜欢的活动1、喜欢的活动2...
1:5 6
course[5]=1 course[6]=1
---------------------------------
2:5
union(2,findFather(course[5]))->
union(2,1)
2->1
---------------------------------
3:5
union(3,findFather(course[5]))->
union(3,1)
3->1
---------------------------------
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int father[1010],course[1010],isRoot[1010];
int findFather(int x){
while(x!=father[x]){
x=father[x];
}
return x;
}
void Union(int a,int b){
int faA=findFather(a);
int faB=findFather(b);
if(faA!=faB)
father[faA]=faB;
}
void init(int n){
for(int i=1;i<=n;i++){
father[i]=i;
isRoot[i]=false;
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,k,h;
cin>>n;
init(n);
for(int i=1;i<=n;i++){
scanf("%d:",&k);
for(int j=0;j<k;j++){
cin>>h;
if(course[h]==0)
course[h]=i;
Union(i,findFather(course[h]));
}
}
for(int i=1;i<=n;i++)
isRoot[findFather(i)]++;
int ans=0;
for(int i=1;i<=n;i++){
if(isRoot[i]!=0)
ans++;
}
cout<<ans<<endl;
sort(isRoot+1,isRoot+n+1,greater<int>());
for(int i=1;i<=ans;i++){
cout<<isRoot[i];
if(i<ans) cout<<" ";
}
return 0;
}
1114
点击查看代码
#include <bits/stdc++.h>
using namespace std;
struct Data
{
int id,fid,mid,num,area;
int cid[10];
}Data[1005];
struct node
{
int id,people;
double num,area;
bool flag=false;
}ans[10000];
int father[10000],vis[10000];
int findFather(int x){
while(x!=father[x]){
x=father[x];
}
return x;
}
void Union(int a,int b){
int faA=findFather(a);
int faB=findFather(b);
if(faA>faB)
father[faA]=faB;
else if(faA<faB)
father[faB]=faA;
}
bool cmp(node a,node b){
if(a.area!=b.area) return a.area>b.area;
else return a.id<b.id;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,k;
cin>>n;
for(int i=0;i<10000;i++){
father[i]=i;
}
for(int i=0;i<n;i++){
cin>>Data[i].id>>Data[i].fid>>Data[i].mid>>k;
vis[Data[i].id]=true;
if(Data[i].fid!=-1){
Union(Data[i].id,Data[i].fid);
vis[Data[i].fid];
}
if(Data[i].mid!=-1){
Union(Data[i].id,Data[i].mid);
vis[Data[i].mid];
}
for(int j=0;j<k;j++){
cin>>Data[i].cid[j];
Union(Data[i].id,Data[i].cid[j]);
vis[Data[i].cid[j]]=true;
}
cin>>Data[i].num>>Data[i].area;
}
for(int i=0;i<n;i++){
int id=findFather(Data[i].id);
ans[id].id=id;
ans[id].num+=Data[i].num;
ans[id].area+=Data[i].area;
ans[id].flag=true;
}
int cnt=0;
for(int i=0;i<10000;i++){
if(vis[i]=true)
ans[findFather(i)].people++;
if(ans[i].flag==true)
cnt++;
}
for(int i=0;i<10000;i++){
if(ans[i].flag){
ans[i].num=(double)(ans[i].num*1.0/ans[i].people);
ans[i].area=(double)(ans[i].area*1.0/ans[i].people);
}
}
sort(ans,ans+10000,cmp);
cout<<cnt<<endl;
for(int i=0;i<cnt;i++){
printf("%04d %d %.3f %.3f\n",ans[i].id,ans[i].people,ans[i].num,ans[i].area);
}
return 0;
}
1118
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int father[10000],vis[10000],isRoot[10000];
int findFather(int x){
while(x!=father[x]){
x=father[x];
}
return x;
}
void Union(int a,int b){
int faA=findFather(a);
int faB=findFather(b);
if(faA>faB)
father[faA]=faB;
else if(faA<faB)
father[faB]=faA;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,tmp,k,cnt=0,birds=0;
cin>>n;
for(int i=1;i<=10000;i++){
father[i]=i;
}
int id, temp;
for(int i = 0; i < n; i++) {
scanf("%d%d", &k, &id);
vis[id] = true;
for(int j = 0; j < k-1; j++) {
scanf("%d", &temp);
Union(id, temp);
vis[temp] = true;
}
}
for(int i=1;i<=10000;i++){
if(vis[i]){
isRoot[findFather(i)]++;
birds++;
}
}
for(int i=1;i<=10000;i++){
if(vis[i]&&isRoot[i]){
cnt++;
}
}
//sort(isRoot,isRoot+10000,greater<int>());
cout<<cnt<<" "<<birds<<endl;
int query,a,b;
cin>>query;
while(query--){
cin>>a>>b;
int faa=findFather(a);
int fab=findFather(b);
if(faa==fab)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
本文来自博客园,作者:勇往直前的力量,转载请注明原文链接:https://www.cnblogs.com/moonlight1999/p/15952845.html