2011年10月15日 星期六

Ubiquitous Religions

內容 :

這個世界上有許多不同的宗教信仰。你想要知道你就讀的大學中,學生們到底信了多少種不同的宗教。

在你就讀的大學中共有 n 個學生 ( 0 < n <= 50000 )。顯然你不可能對每個人個別詢問他們的信仰,而且某些學生也不方便透露他們所信的宗教。而解決這些問題的一種可能的方法是詢問 m ( 0 <= m <= n(n-1)/2 )對學生他們是否信同一個宗教 (例如他們可能一起去某間教堂,會知道他們彼此信相同的宗教 )。由這些資料,即使你沒辦法知道每個人信哪個教,但是你可以估計出他們最多信了多少種不同的宗教。你可以假設每個學生最多信一個宗教。

輸入說明 :
輸入中包含了許多的測試資料。每筆測試資料由一列包含兩個整數 n 及 m 作為開頭。接下來的 m 列每列包含了兩個整數 i 和 j,代表學生 i 和學生 j 信同一個宗教。這些學生編號為 1 到 n。

當 n = m = 0 的時候代表輸入結束。

輸出說明 :
對於每筆測試資料,請先輸出測試資料的編號(由1開始),然後輸出學生們最多信了多少種不同的宗教。

範例輸入 :
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

範例輸出 :
Case 1: 1
Case 2: 7

提示 :
※ 譯 Lucky貓
※ 并查集
※ 請用EOF做結尾,測資不易重生...

出處 :
UVA 10583 (管理:morris1028)

4 則留言:

  1. Dim SP, Kinds, Ti
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2

    Ti = 0
    Do While Not EOF(1)

    Input #1, n, m
    List1.Clear
    Kinds = 1
    If n <> "0" And m <> "0" Then
    Ti = Ti + 1
    ReDim SP(n)
    For i = 0 To n: SP(i) = 0: Next
    For i = 1 To m
    Line Input #1, X
    List1.AddItem X
    Next
    Call A1

    Print #2, "Case " & Ti & ":"; Kinds - 1
    End If
    Loop

    Close
    Close
    End
    End Sub

    Sub A1()
    Dim KK, P, PP


    For i = 0 To List1.ListCount - 1

    PP = List1.List(i)
    P = Split(PP)

    If SP(P(0)) = "0" Then
    SP(P(0)) = Kinds: SP(P(1)) = Kinds: Kinds = Kinds + 1

    Else
    SP(P(1)) = SP(P(0))
    End If

    Next

    For i = 1 To UBound(SP)
    Print SP(i) & "-" & i
    If SP(i) = "0" Then Kinds = Kinds + 1
    Next


    End Sub

    回覆刪除
  2. Dim X()
    Dim s

    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    T = 0
    Do While Not EOF(1)
    T = T + 1
    List1.Clear
    Input #1, N, M
    If N <> 0 Then

    ReDim X(N)
    For i = 1 To N
    X(i) = 0
    Next i

    s = 1
    For i = 1 To M
    Input #1, A, B
    If X(A) = X(B) And X(A) = 0 Then X(A) = s: X(B) = s: s = s + 1

    If X(A) < X(B) Then
    If X(A) = 0 Then X(A) = X(B) Else Call Replace_Same(X(A), X(B))
    End If

    If X(A) > X(B) Then
    If X(B) = 0 Then X(B) = X(A) Else Call Replace_Same(X(B), X(A))
    End If

    Next i

    Print #2, C()

    End If
    Loop
    Close #2
    Close #1
    End
    End Sub

    Sub Replace_Same(Q, W)
    For i = 1 To UBound(X)
    If X(i) = W Then X(i) = Q
    Next i
    End Sub

    Function C()
    ans = 0
    For i = 1 To UBound(X)
    If X(i) = 0 Then ans = ans + 1
    If X(i) <> 0 Then If re(X(i)) = False Then List1.AddItem X(i)
    Next i

    ans = ans + List1.ListCount
    C = ans
    End Function

    Function re(Q) As Boolean
    P = False
    For i = 0 To List1.ListCount - 1
    If List1.List(i) = Q Then P = True: Exit For
    Next i
    re = P
    End Function

    in-----------
    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
    2 8
    10 6
    2 3
    4 5
    6 7
    7 2
    2 1
    5 6
    10 5
    2 3
    4 5
    6 7
    7 2
    2 1
    0 0

    out---------------
    1
    6
    4
    5

    回覆刪除
  3. http://zerojudge.tw/ShowProblem?problemid=a216

    這題 做做看 :D

    回覆刪除
  4. arro好,
    1程式ok。
    2你將檔案資料讀進來,串在一起放在listbox,再從listbox拿出來,用split將它分開,是不是重複動作了,浪費了不必要的時間與動作。

    佑好,
    1程式ok。
    2程式用了連兩層的函數呼叫,然後外頭又共用陣列,很容易想法打結而出錯。

    回覆刪除