程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ Ubiquitous Religions(非常棒的並查集入門題目)

POJ Ubiquitous Religions(非常棒的並查集入門題目)

編輯:C++入門知識

[cpp]   #include <iostream>   #include <cstdio>   using namespace std;   int f[50010];   int sum = 0;   //Accepted  360K    313MS   int find1(int x) {       if(f[x] != x) {           f[x] = find1(f[x]);       }       return f[x];   }      void merge1(int a, int b) {       int f1 = find1(a);       int f2 = find1(b);       if(f1 != f2) {           f[f2] = f1;           sum--;       }   }      int main()   {       int n, m, p = 1;       while(scanf("%d%d", &n, &m) != EOF) {           if( n == 0 && m == 0) { break; }           for(int i = 1; i <= n; i++) {               f[i] = i;           }           sum = n;           for(int i = 1; i <= m; i++) {               int a, b;               scanf("%d%d", &a, &b);               merge1(a, b);           }           printf("Case %d: %d\n", p++, sum);       }       return 0;   }   //另一版本,大概思路相似,僅僅就並的時候,少的像多的並。   #include <iostream>   #include <cstdio>   #include <cstring>   using namespace std;   //Accepted  556K    297MS   struct student {       int index;       int num;       student(){           num = 1;       }   };      student f[50010];///剛剛開始數組開小了,runtime error!   int n, m, sum = 0;   int find1(int x) {//查找       if(f[x].index != x) {          f[x].index = find1(f[x].index);       }       return f[x].index;   }      void merge1(int a, int b){ //合並       int f1 = find1(f[a].index);       int f2 = find1(f[b].index);       if(f1 != f2) {           if(f[f1].num >= f[f2].num) {               f[f1].num += f[f2].num;               f[f2].index = f1;           }           else {               f[f2].num += f[f1].num;               f[f1].index = f2;           }           sum--;       }   }      void init() {//初始化       sum = n;       for(int i = 1; i <= n; i++) {           f[i].index = i;       }   }      int main()   {       int p = 1;       while(scanf("%d%d", &n, &m) != EOF) {           if(!n && !m) { break;}           init();           for(int i = 1; i <= m; i++) {               int a, b;               scanf("%d%d", &a, &b);               merge1(a, b);           }           printf("Case %d: %d\n", p++, sum);       }       return 0;   }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved