1. 程式人生 > >朋友圈問題(並查集)

朋友圈問題(並查集)

問題描述:

        假如已知有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屬於另一個朋友圈,結果為兩個朋友圈。

根據問題:我們可以用資料結構裡的並查集來解決此問題。

問題解決:

#include <iostream>
using namespace std;

class UnionSet
{
public:
	UnionSet(int n)
		:a(new int[n])
	{
		/*int* a=new int[n];*/
		for(int i=0;i<n;i++)
		{
			a[i]=-1;
		}
	}

	~UnionSet()
	{
		if(a != NULL)
			delete a;
	}

	int FindRoot(int x)
	{
		int root=x;
		while(a[root] >= 0)
		{
			root--;
		/*	root=a[root];*/
		}
		return root;
	}

	void Union(int root1,int root2)
	{
		int _root1=FindRoot(root1);
		int _root2=FindRoot(root2);
		if(root1 != root2)
		{
			a[_root1]+=a[_root2];
		    a[_root2]=_root1;
		}
	}

	int count(int n)
	{
		int count=0;
		for(int i=0;i<n;i++)
		{
			if(a[i] < 0)
				count++;
		}
		return count-1;
	}
private:
	int *a;
};

int Friends(int n,int m,int r[][2])  //int *r[]  
{
	UnionSet u(n+1);
	for(int i=0;i<m;i++)
	{
		u.Union(r[i][0],r[i][1]);
	}
	return u.count(n+1);
}