【并查集】团伙(luogu 1892)
生活随笔
收集整理的這篇文章主要介紹了
【并查集】团伙(luogu 1892)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
團伙
luogu 1892
代碼:
定義對手的對手是朋友,朋友的朋友是朋友,現在有n個人和m組關系,如果兩個人是朋友那么他們屬于同一個團伙,問有多少個團伙
原題:
題目描述
1920年的芝加哥,出現了一群強盜。如果兩個強盜遇上了,那么他們要么是朋友,要么是敵人。而且有一點是肯定的,就是:
我朋友的朋友是我的朋友;
我敵人的敵人也是我的朋友。
兩個強盜是同一團伙的條件是當且僅當他們是朋友。現在給你一些關于強盜們的信息,問你最多有多少個強盜團伙。
輸入輸出格式
輸入格式:
輸入文件gangs.in的第一行是一個整數N(2<=N<=1000),表示強盜的個數(從1編號到N)。 第二行M(1<=M<=5000),表示關于強盜的信息條數。 以下M行,每行可能是F p q或是E p q(1<=p q<=N),F表示p和q是朋友,E表示p和q是敵人。輸入數據保證不會產生信息的矛盾。
輸出格式:
輸出文件gangs.out只有一行,表示最大可能的團伙數。
輸入輸出樣例
輸入樣例#1:
6 4 E 1 4 F 3 5 F 4 6 E 1 2輸出樣例#1:
3解題思路:
記下每個人的敵人,如果遇到敵人,就和敵人的敵人合并,如果遇到朋友就直接合并
代碼:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,m,p,q,x1,y1,pd,ans,a[1005][1005],dad[1005]; char x; int find(int dep){return dad[dep]==dep?dep:dad[dep]=find(dad[dep]);}//并查集 int main() {scanf("%d %d",&n,&m);for (int i=1;i<=n;++i)dad[i]=i;for (int i=1;i<=m;++i){cin>>x;while (x!='E'&&x!='F') cin>>x;//讀入scanf("%d %d",&p,&q);if (x=='F'){x1=find(p);//合并y1=find(q);dad[min(x1,y1)]=max(x1,y1);}else{for (int j=1;j<=a[p][0];++j)//敵人的敵人{if (a[p][j]==q) continue;x1=find(a[p][j]);y1=find(q);dad[min(x1,y1)]=max(x1,y1);}for (int j=1;j<=a[q][0];++j)//反過來也要{if (a[q][j]==p) continue;x1=find(a[q][j]);y1=find(p);dad[min(x1,y1)]=max(x1,y1);}a[p][++a[p][0]]=q;//記下來a[q][++a[q][0]]=p;}}for (int i=1;i<=n;++i){pd=1;for (int j=i+1;j<=n;++j)if (find(i)==find(j))//看是否在同一個團伙{pd=0;break;}if (pd) ans++;}printf("%d",ans); }總結
以上是生活随笔為你收集整理的【并查集】团伙(luogu 1892)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 诛仙3电脑配置要求2022年(诛仙3电脑
- 下一篇: cad制图电脑配置推荐(cad什么电脑配