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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

并查集的一般操作 ③

發布時間:2025/3/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并查集的一般操作 ③ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

RT

?

題目描述

?

1920年的芝加哥,出現了一群強盜。如果兩個強盜遇上了,那么他們要么是朋友,要么是敵人。而且有一點是肯定的,就是:

?

我朋友的朋友是我的朋友;

?

我敵人的敵人也是我的朋友。

?

兩個強盜是同一團伙的條件是當且僅當他們是朋友。現在給你一些關于強盜們的信息,問你最多有多少個強盜團伙。

?

輸入輸出格式

輸入格式:

?輸入的第一行是一個整數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是敵人。輸入數據保證不會產生信息的矛盾。

?輸出格式:

?輸出只有一行,表示最大可能的團伙數。

?

輸入:?     ?輸出:

6                3
4
E 1 4
F 3 5
F 4 6
E 1 2

?

一看這題,是一道并查集的好?水??題,但好像和以往的不太一樣;

想一想,好像是個數學集合;

把朋友并一起,把敵人的敵人并到朋友;

par[n]存 朋友,par[n*2]存敵人;

然后就好了;

#include <cstdio> #include <algorithm>using namespace std;struct b {int par[100010];inline void ih(int n){for(int i=1;i<=2*n;i++)par[i]=i;}int f(int x){return par[x]=(par[x]==x)?x:f(par[x]);}int u(int x,int y){par[f(y)]=f(x);} }s; int n,m,sum; int x,y; char c; int main() {scanf("%d",&n);scanf("%d",&m);s.ih(n);for(int i=1;i<=m;++i){scanf("%s%d%d",&c,&x,&y);if(c=='F'){s.u(x,y);}else if(c=='E'){s.u(y,x+n); //不要并反了s.u(x,y+n);}}for(int i=1;i<=n;++i){if(s.par[i]==i) sum++; }printf("%d",sum); } 騷代碼

?

轉載于:https://www.cnblogs.com/AidenPearce/p/8289730.html

總結

以上是生活随笔為你收集整理的并查集的一般操作 ③的全部內容,希望文章能夠幫你解決所遇到的問題。

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