Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 20668 | Accepted: 10153 |
Descriptionexpress
Inputide
Outputui
Sample Inputthis
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
Sample Outputidea
Case 1: 1 Case 2: 7
題目大意:輸入n,m表明有n個幫派,下面輸入m行x,y,表明學生x,y同一個幫派,問總共有多少個幫派。
解題方法:並查集,每次輸入x,y時若是發現他們不一樣幫派,則n減一,而後合併。
#include <stdio.h> typedef struct { int parent; int rank; }UFSTree; UFSTree Student[50005]; void MakeSet(int n) { for (int i = 0; i <= n; i++) { Student[i].parent = i; Student[i].rank = 0; } } int FindSet(int x) { if (x != Student[x].parent) { return FindSet(Student[x].parent); } else { return x; } } void UnionSet(int x, int y) { x = FindSet(x); y = FindSet(y); if (Student[x].rank > Student[y].rank) { Student[y].parent = x; } else { Student[x].parent = y; if (Student[x].rank == Student[y].rank) { Student[y].rank++; } } } int main() { int m, n, x, y, nCase = 0; while(scanf("%d%d", &n, &m) != EOF && n != 0 && m != 0) { MakeSet(n); for (int i = 0; i < m; i++) { scanf("%d%d", &x, &y); if (FindSet(x) != FindSet(y)) { n--; UnionSet(x, y); } } printf("Case %d: %d\n", ++nCase, n); } return 0; }