日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【并查集】团伙(luogu 1892)

發布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【并查集】团伙(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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。