程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> rqnoj 577 團伙

rqnoj 577 團伙

編輯:C++入門知識

終於找到這題的提交鏈接了,劉汝佳那本書81頁有這題的的題解,不重復了。 我覺得這題思維還是很饒人的。 題目大體的說: 1.我朋友的朋友是我的朋友;  2.我敵人的敵人是我的朋友; 所有是朋友的人組成一個團伙。告訴你關於這N個人的M條信息,即某兩個人是朋友,或者某兩個人是敵人,請你編寫一個程序,計算出這個城市最多可能有多少個團伙? 用並查集來記錄,其中e[i]記錄i的是i的敵人組成的團伙。 [cpp]   #include <iostream>   #include <stdio.h>   #include <stdlib.h>   #include <string.h>   #include <math.h>   #include <algorithm>   #include <stack>   #include <queue>   #include <map>   using namespace std;      int f[1005];   int e[1005];   int vis[1005];      int findset(int a)   {       if(a == f[a])       {           return a;       }       f[a] = findset(f[a]);       return f[a];      }   void unionset(int a,int b)   {       a = findset(a);       b = findset(b);       if(a!=b)       {           f[b] = a;       }   }   int main()   {       /*#ifndef ONLINE_JUDGE          freopen("in.txt","r",stdin);      #endif*/       int n,m;       char c;       int a,b;       while(scanf(" %d %d",&n,&m)!=EOF)       {           memset(e,0,sizeof(e));           memset(vis,0,sizeof(vis));              for(int i=1; i<=n; i++)           {               f[i] = i;           }           for(int i=0; i<m; i++)           {               scanf(" %c %d %d",&c,&a,&b);               //printf("c = %c\n",c);               if(c == 'F')               {                   unionset(a,b);               }               else if(c == 'E')               {                   if(e[a] == 0)                   {                       e[a] = b;                   }                   else                   {                       unionset(e[a],b);                   }                   if(e[b] == 0)                   {                       e[b] = a;                   }                   else                   {                       unionset(e[b],a);                   }               }           }           int sum = 0;           for(int i=1; i<=n; i++)           {  www.2cto.com             int cur = findset(i);               if(vis[cur] == 0)               {                   vis[cur] = 1;                   sum++;               }           }           printf("%d\n",sum);       }       return 0;   }    

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