程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVA - 10608-Friends(並查集)

UVA - 10608-Friends(並查集)

編輯:C++入門知識

題目:UVA - 10608-Friends


題目大意:給定n個人,和m個關系,m個關系代表誰和誰認識之類的,求這樣的關系中,朋友圈人數最多的人數。


解題思路:這題用並查集來判斷這兩個人是否屬於同一個朋友圈,剛開始每個人自己形成一個朋友圈,所以朋友圈人數為1,然後每碰到一個關系就判斷這兩個人是否屬於同一個朋友圈,如果不是,就把其中一個的f【t】(t為這個圈子的根)改為另一個朋友圈的根r,然後把以r為根的這個圈子的人數加上以t為根的圈子的朋友數。這樣最後只要找f【i】 == i(這樣的i是根)的這樣的圈子的朋友數,找最大的。

代碼:

#include 
#include 

const int N = 30005;
int n, m , t, f[N], c[N];

void init () {

	for (int i = 0; i <= n; i++ ) {

		f[i] = i;
		c[i] = 1;
	}
}
	
int  getfather (int x) {

 	return	f[x] = ( f[x] == x ) ? x : getfather (f[x]);
}

int main () {

	scanf ("%d", &t);
	while (t--) {
	
		scanf ("%d%d", &n, &m);
		int x, y;
		init();
		for (int i = 0; i < m; i++) {

			scanf ("%d%d", &x, &y);
			int p = getfather(x);
			int q = getfather(y);
			if (p !=  q){
				
				c[p] += c[q];
				f[q] = p;
			}

		}
		int max = 0;
		for (int i = 1; i <= n; i++)
			if (i == f[i] && max < c[i])
				max = c[i];
		printf ("%d\n", max);	

	}
	return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved