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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

7-25 朋友圈 (25 分)(详解+并查集的了解和应用)

發(fā)布時(shí)間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7-25 朋友圈 (25 分)(详解+并查集的了解和应用) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一:題目

某學(xué)校有N個(gè)學(xué)生,形成M個(gè)俱樂(lè)部。每個(gè)俱樂(lè)部里的學(xué)生有著一定相似的興趣愛(ài)好,形成一個(gè)朋友圈。一個(gè)學(xué)生可以同時(shí)屬于若干個(gè)不同的俱樂(lè)部。根據(jù)“我的朋友的朋友也是我的朋友”這個(gè)推論可以得出,如果A和B是朋友,且B和C是朋友,則A和C也是朋友。請(qǐng)編寫(xiě)程序計(jì)算最大朋友圈中有多少人。

輸入格式:
輸入的第一行包含兩個(gè)正整數(shù)N(≤30000)和M(≤1000),分別代表學(xué)校的學(xué)生總數(shù)和俱樂(lè)部的個(gè)數(shù)。后面的M行每行按以下格式給出1個(gè)俱樂(lè)部的信息,其中學(xué)生從1~N編號(hào):

第i個(gè)俱樂(lè)部的人數(shù)Mi(空格)學(xué)生1(空格)學(xué)生2 … 學(xué)生Mi

輸出格式:
輸出給出一個(gè)整數(shù),表示在最大朋友圈中有多少人。

輸入樣例:
7 4
3 1 2 3
2 1 4
3 5 6 7
1 6
輸出樣例:
4

二:思路

利用并查集,求得根節(jié)點(diǎn)的得數(shù)組,再用map<int,int> 來(lái)計(jì)算當(dāng)中重復(fù)次數(shù)多的個(gè)數(shù) 也就是根節(jié)點(diǎn)相同的個(gè)數(shù)最大值

三:上碼

#include<bits/stdc++.h> using namespace std;int father[30000]; //int find( int x){ // // while( x != father[x] ) // { // x = father[x]; // } // // return x; //}//壓縮路徑 int find(int x){int r=x;while(father[r]!=r)r=father[r]; //找到他的前導(dǎo)結(jié)點(diǎn)int i=x,j;while(i!=r){ //路徑壓縮算法j=father[i]; //記錄x的前導(dǎo)結(jié)點(diǎn)father[i]=r; //將i的前導(dǎo)結(jié)點(diǎn)設(shè)置為r根節(jié)點(diǎn)i=j;}return r; } void merge(int x,int y) {int a = find(x);//x的根節(jié)點(diǎn)為a int b = find(y);//y的根節(jié)點(diǎn)為bif( a != b )father[b] = a;//那么將b的根節(jié)點(diǎn) 設(shè)為 a }int main() {int N,M;cin >> N >> M;for( int i = 1; i <= N; i++ )father[i] = i; //設(shè)置根節(jié)點(diǎn)為數(shù)組下標(biāo),另外元素值為索引 for( int j = 0; j < M; j++ ){int num;cin >> num;vector<int>v;for( int k = 0; k < num; k++ ){int numPeople;cin >> numPeople;v.push_back(numPeople); }for( int i = 0; i < num-1; i++ ){if( find(v[i]) != find(v[i+1]) )merge(v[i],v[i+1]);//比如剛開(kāi)始的 1和2 他們?cè)瓉?lái)的根節(jié)點(diǎn)不同,所以合并 也就是將索引值為2的數(shù)組值改為1 即根節(jié)點(diǎn)值為1 } }map<int,int>m;for( int i = 1; i <= N; i++){m[find(i)]++; //這里是find(i) 不能是father[i] 否則最后一個(gè)測(cè)試點(diǎn)答案錯(cuò)誤} map<int,int>:: iterator t;int max = 0;for(t = m.begin(); t!= m.end(); t++){if( max < t->second )max = t->second;}cout << max;}//7 4 //3 1 2 3 //2 1 4 //3 5 6 7 //1 6// 7 4 // 2 1 4 // 3 5 6 7 // 1 6 // 3 1 2 3

四:并查集的相關(guān)知識(shí)

這道題用到了并查集,所以我就學(xué)了一下并查集,所以把自己的見(jiàn)解也分享給大家(建議 先看視頻 再瀏覽 博客 再自己敲一遍 學(xué)習(xí)效率高而已,我總是亂著來(lái) 以為看幾篇博客就會(huì)了,其實(shí)最后還是老老實(shí)實(shí) 去B站看大佬講解視頻 才搞懂)

1:并查集

查集是一種樹(shù)型的數(shù)據(jù)結(jié)構(gòu),
用于處理一些不相交集合(Disjoint Sets)的合并及查詢問(wèn)題
1:查詢?cè)豠和元素b是否屬于同一組
2:合并元素a和元素b所在組 (將有相同元素的元素 合并為一個(gè)組 )
3:需要初始化一個(gè)數(shù)組存放父節(jié)點(diǎn),其索引值 代表元素

2:并查集的AC代碼(模板`)

/*并查集是一種樹(shù)型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不相交集合(Disjoint Sets)的合并及查詢問(wèn)題1:查詢?cè)豠和元素b是否屬于同一組2:合并元素a和元素b所在組 (將有相同元素的元素 合并為一個(gè)組 ) 3:需要初始化一個(gè)數(shù)組存放父節(jié)點(diǎn),其索引值 代表元素 */#include<bits/stdc++.h> using namespace std;int father[100]; int find( int x){while( x != father[x] ){x = father[x];}return x; } void merge(int x,int y) {int a = find(x);//x的根節(jié)點(diǎn)為a int b = find(y);//y的根節(jié)點(diǎn)為bif( a != b )father[b] = a;//那么將b的根節(jié)點(diǎn) 設(shè)為 a }int main() {//初始化: 我們將每一個(gè)結(jié)點(diǎn)的前導(dǎo)結(jié)點(diǎn)設(shè)置為自己,//如果在merge函數(shù)時(shí)未能形成連通,將獨(dú)立成點(diǎn)for( int i = 0; i < 10; i++ ){father[i] = i;}}

上方的find函數(shù) 效率不高,當(dāng)處理大數(shù)據(jù)時(shí),使用并查集查找時(shí),如果查找次數(shù)很多,那么使用樸素版的查找方式肯定要超時(shí)。比如,有一百萬(wàn)個(gè)元素,每次都從第一百萬(wàn)個(gè)開(kāi)始找,這樣一次運(yùn)算就是106,如果程序要求查找個(gè)一千萬(wàn)次,這樣下來(lái)就是1013,肯定要出問(wèn)題的。

所以有了壓縮路徑的算法(就是一棵樹(shù)只有葉節(jié)點(diǎn))

void merge(int x,int y){int a=find(x);//x的根節(jié)點(diǎn)為aint b=find(y);//y的根節(jié)點(diǎn)為bif(a!=b)//如果a,b不是相同的根節(jié)點(diǎn),則說(shuō)明ab不是連通的pre[a]=b;//我們將ab相連 將a的前導(dǎo)結(jié)點(diǎn)設(shè)置為b }

如有疑問(wèn) 請(qǐng)留言! 加油陌生的你

總結(jié)

以上是生活随笔為你收集整理的7-25 朋友圈 (25 分)(详解+并查集的了解和应用)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美黄视频 | 网站免费在线观看 | 成人国产片女人爽到高潮 | 隣の若妻さん波多野结衣 | 国产亚洲精品网站 | 国产亚洲一区二区三区在线观看 | 天天舔天天插 | 日日干视频 | 男人干女人视频 | 98av视频 | 原来神马电影免费高清完整版动漫 | 第九色 | 亚洲一区免费在线观看 | 亚洲成人影音 | 国产无遮挡又黄又爽免费视频 | 男人女人拔萝卜视频 | 日韩精品一区在线观看 | 久草热在线视频 | 中文字幕免费观看视频 | 国产91精品露脸国语对白 | 国产精品午夜影院 | 总裁边开会边做小娇妻h | 久久97人妻无码一区二区三区 | 中国白嫩丰满人妻videos | 香蕉国产片 | 国产精品国产三级国产aⅴ原创 | 男人av网站 | 久久久久久久久久久久久女国产乱 | 欧美精品www | 韩日午夜在线资源一区二区 | 欧美精品一级 | 五月天激情影院 | 91porny九色91啦中文 | 毛茸茸亚洲孕妇孕交片 | 国产激情无套内精对白视频 | 久久免费视频一区 | 自拍偷拍国产精品 | 男女男网站 | 第一福利在线 | 亚洲毛片一区二区三区 | 日韩在线观看中文字幕 | 黄网在线看| 色涩综合 | 天堂a√在线 | 国产精品一区二区三区久久久 | 久久99中文字幕 | 天天干天天色综合 | 日日干日日爽 | 一区二区三区不卡在线观看 | 中文字幕1 | 色伊人av | 电影《走路上学》免费 | 中文在线a在线 | 91免费视频网站 | 无码国产精品久久一区免费 | 久久久亚洲欧美 | 国产无遮挡免费观看视频网站 | 毛片毛片毛片毛片毛片毛片毛片毛片 | 日本五十熟hd丰满 | 999av视频| 国产午夜免费 | 亚洲天堂岛 | 岛国大片在线观看 | 欧美破处大片 | 日本一级片免费看 | 亚洲av乱码一区二区 | 99久久国产宗和精品1上映 | 午夜天堂精品 | 欧美1页 | 天天舔天天爽 | 中文字幕在线观看高清 | 偷拍老头老太高潮抽搐 | 高清福利视频 | 国产精品自拍偷拍视频 | 日本三级精品 | 精品熟女一区二区 | 黄色大片aaa | 天天射寡妇 | 自拍偷拍视频网 | 欧美精品一二三四区 | 三级精品在线 | 欧美亚洲另类小说 | 亚洲高潮 | 国产黄在线免费观看 | 久草a视频 | 亚洲精品国产精品乱码视色 | 日韩精品一区在线视频 | 国产精品jizz在线观看美国 | 黑白配高清国语在线观看 | xxxx国产片 | 大奶子av| 女人下边被添全过视频 | 亚洲精品在线免费播放 | 免费黄色在线 | 成人黄色片免费看 | www.操| 超碰天天操 | 亚洲国产视频在线观看 | 欧美熟妇交换久久久久久分类 |