东南大学在线评测系统【52: 校赛题:DG之社团调查】

题目描述:

自从进了大学,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[] 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[] arr = new Vector[n + 1];
            for (int i = 1; i <= n; i++)
                arr[i] = new Vector();
            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);
        }
    }
}

你可能感兴趣的:(东南大学在线评测系统【52: 校赛题:DG之社团调查】)