题目描述:
自从进了大学,DG发现周围所有的同学几乎都进了社团,他十分想知道同学们究竟都参加了多少个不同的社团。但是DG觉得直接问同学参加了什么社团不够礼貌,因为那样就显得自己对同学不够关心了解。于是聪明的DG想到了另外一种问法:“A和B是否是同一个社团?”。这样一来虽然DG不能直接得到同学参加社团的信息,但是他可以从这次些关系中统计出周围人所参与的社团的个数(假如每个同学最多只能参加一个社团,没有人参加的社团不用考虑)。要么,你也来试一试?
输入:
输入包含多组测试数据;
每组测试数据的第一行包含两个整数n,m。其中n表示总人数。接下来有m行,每行有两个整数i,j,表示i,j两人同属于一个社团; (0 < n <= 50000,0 <= m <= n(n-1)/2)
当n=m=0时输入结束。
输出:
对于每组测试样例输出一行,表示被询问到的人最多参加了多少个不同的社团。
样例输入:
10 9
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
10 4
2 3
4 5
4 8
5 8
0 0
样例输出:
1
7
问题分析:
可以将n个学生看成n个点,而两个学生属于同一社团可看成两个点之间存在一条边,而这n个学生最多参加几个社团就可以看成这n个点总共可以组成多少个强连通图,dfs解之
java实现如下:
import java.util.Scanner;
import java.util.Vector;
public class Main {
static void dfs(int num, int[] sign, Vector<Integer>[] arr) {
sign[num] = 1;
for (int i = 0, len = arr[num].size(); i < len; i++) {
int x = arr[num].elementAt(i);
if (sign[x] == 0)
dfs(x, sign, arr);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt(), m = sc.nextInt(), count = 0;
if (m + n == 0)
return;
int[] sign = new int[n + 1];
@SuppressWarnings("unchecked")
Vector<Integer>[] arr = new Vector[n + 1];
for (int i = 1; i <= n; i++)
arr[i] = new Vector<Integer>();
for (int i = 0; i < m; i++) {
int l = sc.nextInt(), r = sc.nextInt();
arr[l].add(r);
arr[r].add(l);
}
for (int i = 1; i <= n; i++) {
if (sign[i] != 1) {
dfs(i, sign, arr);
count++;
}
}
System.out.println(count);
}
}
}