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

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

生活随笔

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

编程问答

#1066 : 无间道之并查集

發(fā)布時(shí)間:2024/9/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 #1066 : 无间道之并查集 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

#1066 : 無(wú)間道之并查集
時(shí)間限制:20000ms
單點(diǎn)時(shí)限:1000ms
內(nèi)存限制:256MB
描述
這天天氣晴朗、陽(yáng)光明媚、鳥語(yǔ)花香,空氣中彌漫著春天的氣息……額,說(shuō)遠(yuǎn)了,總之,小Hi和小Ho決定趁著這朗朗春光出去玩。

但是剛剛離開(kāi)居住的賓館不久,抄近道不小心走入了一條偏僻小道的小Hi和小Ho就發(fā)現(xiàn)自己的前方走來(lái)了幾個(gè)彪形大漢,定睛一看還都是地地道道的黑人兄弟!小Hi和小Ho這下就慌了神,撿肥皂事小,這一身百把來(lái)斤別一不小心葬身他鄉(xiāng)可就沒(méi)處說(shuō)去了。

就在兩人正舉足無(wú)措之時(shí),為首的黑叔叔從懷里掏出了一件東西——兩張花花綠綠的紙,分別遞給了小Hi和小Ho。

小Hi和小Ho接過(guò)來(lái),只見(jiàn)上面寫道(譯為中文):“本地最大的幫派——青龍幫,誠(chéng)邀您的加入!”下面還詳細(xì)的列出了加入青龍幫的種種好處。

于是兩人略感心安,在同黑叔叔們交談一番之后,已是均感相見(jiàn)恨晚。同時(shí),在小Hi和小Ho表示自己不日便將回國(guó)之后,黑叔叔們也沒(méi)有再提加入幫派之事,但是那為首的黑叔叔思索一會(huì),開(kāi)口道(譯為中文):“我現(xiàn)在有一個(gè)難題,思索了很久也沒(méi)法子解決,既然你們倆都是高材生,不如來(lái)幫我看看?!?/p>

小Hi和小Ho點(diǎn)了點(diǎn)頭表示沒(méi)問(wèn)題,于是黑叔叔繼續(xù)說(shuō)道:“這個(gè)問(wèn)題是這樣的,我們幫派最近混進(jìn)了許多警察的臥底,但是在我們的調(diào)查過(guò)程中只能夠知道諸如‘某人和另一個(gè)人是同陣營(yíng)的’這樣的信息,雖然沒(méi)有辦法知道他們具體是哪個(gè)陣營(yíng)的,但是這樣的信息也是很重要的,因?yàn)槲覀兘?jīng)常會(huì)想要知道某兩個(gè)人究竟是不是同一陣營(yíng)的。”

小Hi和小Ho贊同的點(diǎn)了點(diǎn)頭,畢竟無(wú)間道也都是他們看過(guò)的。

黑叔叔接著說(shuō)道:“于是現(xiàn)在問(wèn)題就來(lái)了,我希望你們能寫出這樣一個(gè)程序,我會(huì)有兩種操作,一種是告訴它哪兩個(gè)人是同一陣營(yíng)的,而另一種是詢問(wèn)某兩個(gè)人是不是同一陣營(yíng)的……既然你們就要回國(guó)了,不如現(xiàn)在就去我們幫派的總部寫好這個(gè)程序再走把。”

為了生命安全與……小Hi和小Ho都不得不解決這個(gè)問(wèn)題!那么他們究竟從何下手呢?

提示:說(shuō)起來(lái)其實(shí)就是不斷的合并集合嘛~
輸入
每個(gè)測(cè)試點(diǎn)(輸入文件)有且僅有一組測(cè)試數(shù)據(jù)。

每組測(cè)試數(shù)據(jù)的第1行為一個(gè)整數(shù)N,表示黑叔叔總共進(jìn)行的操作次數(shù)。

每組測(cè)試數(shù)據(jù)的第2~N+1行,每行分別描述黑叔叔的一次操作,其中第i+1行為一個(gè)整數(shù)op_i和兩個(gè)由大小寫字母組成的字符串Name1_i, Name2_i,其中op_i只可能為0或1,當(dāng)op_i=0時(shí),表示黑叔叔判定Name1_i和Name2_i是同一陣營(yíng)的,當(dāng)op_i=1時(shí),表示黑叔叔希望知道Name1_i和Name2_i是否為同一陣營(yíng)的。

對(duì)于100%的數(shù)據(jù),滿足N<=10^5, 且數(shù)據(jù)中所有涉及的人物中不存在兩個(gè)名字相同的人(即姓名唯一的確定了一個(gè)人),對(duì)于所有的i,滿足Name1_i和Name2_i是不同的兩個(gè)人。

輸出
對(duì)于每組測(cè)試數(shù)據(jù),對(duì)于黑叔叔每次op_i=1的操作,輸出一行,表示查詢的結(jié)果:如果根據(jù)已知信息(即這次操作之前的所有op_i=0的操作),可以判定詢問(wèn)中的兩個(gè)人是同一陣營(yíng)的,則輸出yes,否則輸出no。

樣例輸入
10
0 Steven David
0 Lcch Dzx
1 Lcch Dzx
1 David Dzx
0 Lcch David
0 Frank Dzx
1 Steven Dzx
1 Frank David
0 Steven Dzx
0 Dzx Frank
樣例輸出
yes
no
yes
yes
/*
做這題因?yàn)槲矣X(jué)得他簡(jiǎn)單,
然后看到是名字,和平常寫的是數(shù)字不一樣,就有點(diǎn)亂,一開(kāi)始就一直想用二維vector或mulitmap來(lái)建立關(guān)系,但是大晚上的思緒很是混亂,沒(méi)有成功,就想著暴力一發(fā),TEL,然后睡覺(jué)去了,
睡在床上就冷靜下來(lái),頭腦清醒了,我只要把名字換成編號(hào)不就很平常一樣了嗎,再想想如何給他們編號(hào),編號(hào)和名字一一對(duì)應(yīng),所以我就想到用map了,因?yàn)閙ap的key值唯一,用key判斷名字是否出現(xiàn),沒(méi)有出現(xiàn)過(guò)的名字就給他一個(gè)編號(hào),nice!然后我安穩(wěn)的碎覺(jué)了。第二天早上,早簽到,晨跑,買早餐,吃早餐,去上課前在寢室打開(kāi)電腦就很快就寫出來(lái)了,AC!!開(kāi)心上課去~~
*/
AC_code:

#include <bits/stdc++.h> const int MAXN = 1e5+5; using namespace std; map<string,int>mp; int k,pre[MAXN]; void getNum(string s1,string s2) {if(!mp[s1]){mp[s1] = ++k;}if(!mp[s2]){mp[s2] = ++k;} } int find(int x) {if(pre[x]==0)return x;return pre[x] = find(pre[x]); } void merge(int x,int y) {int fx = find(x),fy = find(y);if(fx != fy){pre[fx] = fy;} } int main() {int n;cin>>n;int op;string s1,s2;for(int i = 0; i < n; i++){cin>>op>>s1>>s2;getNum(s1,s2); if(op == 0){merge(mp[s1],mp[s2]);}else{int x = find(mp[s1]), y = find(mp[s2]);if(x == y)cout<<"yes"<<endl;elsecout<<"no"<<endl;}s1.clear();s2.clear();}return 0; }

下面是昨晚,我腦洞大開(kāi)的暴力代碼,TEL:

#include <bits/stdc++.h> #define fFind string::npos using namespace std; int main() {int n,op,k;cin>>n;vector<string>data;string s1,s2,s3;k = 0;s3 = "00";data.push_back(s3);int flag ,temp;for(int i = 0; i < n; i++){cin>>op>>s1>>s2;if(op == 0){flag = 1;for(int j = 0; j < data.size(); j++){string st = s1 + "00" + s2;if(data[j].find(s1)!=fFind||data[j].find(s2)!=fFind){if(flag){data[j] += st;flag = 0;temp = j;}else{data[temp] += data[j];data.erase(data.begin()+j);}}else{data.push_back(st);}}}else{int flag2 = 0;for(int p = 0; p < data.size(); p++){if(data[p].find(s1)!=fFind&&data[p].find(s2)!=fFind){cout<<"yes"<<endl;flag2 = 1;break;}}if(!flag2) cout<<"no"<<endl;}}return 0; }

總結(jié)

以上是生活随笔為你收集整理的#1066 : 无间道之并查集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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