团伙(信息学奥赛一本通-T1385)
生活随笔
收集整理的這篇文章主要介紹了
团伙(信息学奥赛一本通-T1385)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
在某城市里住著n個人,任何兩個認識的人不是朋友就是敵人,而且滿足:
1、我朋友的朋友是我的朋友;
2、我敵人的敵人是我的朋友;
所有是朋友的人組成一個團伙。告訴你關于這n個人的m條信息,即某兩個人是朋友,或者某兩個人是敵人,請你編寫一個程序,計算出這個城市最多可能有多少個團伙?
【輸入】
第1行為n和m,1<n<1000,1≤m≤100 000;
以下m行,每行為p x y,p的值為0或1,p為0時,表示x和y是朋友,p為1時,表示x和y是敵人。
【輸出】
一個整數,表示這n個人最多可能有幾個團伙。
【輸入樣例】
6 4
1 1 4
0 3 5
0 4 6
1 1 2
【輸出樣例】
3
【源程序】
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<set> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 5001 #define MOD 123 #define E 1e-6 using namespace std; int father[N]; int vis[N]; int cnt; int Find(int x) {if(father[x]==x)return x;return father[x]=Find(father[x]); } void Union(int x,int y) {int xx=Find(x);int yy=Find(y);if(xx!=yy)father[xx]=yy; } int main() {int n,m;cin>>n>>m;for(int i=1;i<=2*n;i++)father[i]=i;while(m--){int p,x,y;cin>>p>>x>>y;if(p==0)Union(x,y);else{Union(x,y+n);Union(x+n,y);}}int cnt=0;for(int i=1;i<=n;i++){int temp=Find(i);if(!vis[temp]){vis[temp]=1;cnt++;}}cout<<cnt<<endl;return 0; }?
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的团伙(信息学奥赛一本通-T1385)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 八皇后问题 (信息学奥赛一本通-T121
- 下一篇: 暑期训练日志----2018.8.13