題目來源http://ac.jobdu.com/problem.php?pid=1526
題目1526:朋友圈
時間限制:1 秒
記憶體限制:128 兆
特殊判題:否
提交:411
解決:100
-
題目描述:
-
假如已知有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個朋友圈。
-
輸入:
-
輸入包含多個測試案例,每個測試案例的第一行包含兩個正整數 n、m,1=<n,m<=100000。接下來有m行,每行分別輸入兩個人的編號f,t(1=<f,t<=n),表示f和t是好友。 當n為0時,輸入結束,該用例不被處理。
-
輸出:
-
對應每個測試案例,輸出在這n個人裡一共有多少個朋友圈。
-
範例輸入:
-
5 31 22 34 53 31 21 32 30
-
範例輸出:
-
21
-
來源:
-
小米2013年校園招聘筆試題
思路: 並查集路徑壓縮演算法
import java.io.*;import java.util.*;public class Main {public static int n,m;public static int pattern[];public static void main(String[] args) {Scanner sc=new Scanner(new BufferedInputStream(System.in));PrintWriter pw=new PrintWriter(new BufferedOutputStream(System.out),true);while(sc.hasNext()){n=sc.nextInt();m=sc.nextInt();pattern=new int[n+1];for(int i=1;i<=n;i++){pattern[i]=i;}for(int i=0;i<m;i++){int a=sc.nextInt();int b=sc.nextInt();union(a,b);}int ans=0;for(int i=1;i<=n;i++){if(pattern[i]==i)ans++;}pw.println(ans);}}public static void union(int a,int b){int aa=fun(a);int bb=fun(b);if(aa==bb)return;if(aa>bb)pattern[bb]=aa;elsepattern[aa]=bb;}public static int fun(int aa){int p=pattern[aa];if(p==aa)return p;else return fun(p);}}