您的位置:首页 > 其它

并查集简单应用

2014-03-20 21:39 190 查看
问题:朋友圈(25分)

假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。

假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个朋友圈,结果为2个朋友圈。

最后请分析所写代码的时间、空间复杂度。评分会参考代码的正确性和效率。

思路:简单的并查集的应用

#include<iostream>

#include<stdio.h>

using namespace std;

const int MAX_N=1005;

int N,M;

int par[MAX_N],rank[MAX_N];

void initset(int n)

{

for(int i=1;i<=n;i++)

{

par[i]=i;

rank[i]=0;

}

}

int findpar(int x)

{

if(x==par[x])

return x;

return par[x]=findpar(par[x]);

}

void unionset(int x,int y)

{

x=findpar(x);

y=findpar(y);

if(x==y)

return ;

//当两者高度不等的时候,新的根节点秩不会改变

if(rank[x]<rank[y])

par[x]=y;

else

{

par[y]=x;

if(rank[x]==rank[y])

rank[x]++;

}

}

int main(int argc,char *argv[])

{

freopen("input.txt","r",stdin);

while(cin>>N>>M)

{

initset(N);

for(int i=0;i<M;i++)

{

int x,y;

cin>>x>>y;

unionset(x,y);

}

int res=0;

for(int i=1;i<=N;i++)

if(par[i]==i)

res++;

cout<<res<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: