国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

CF Round#396D (Div. 2)(Codeforces 766D) 簡單并查集+map

2019-11-10 21:32:26
字體:
來源:轉載
供稿:網友

題目鏈接:http://codeforces.com/PRoblemset/problem/766/D

題目大意:這貨要建一個n個詞的字典,然后里面有m組關系(相似或是對立關系),其中關系是一組(兩個詞)一組錄入的; 每次錄入的時候都要回答這個關系是不是矛盾(比如先錄入了like和love是近義詞,然后錄入like和hate是反義詞,這時候再錄入love和hate是近義詞就會產生矛盾); 錄入完之后,會有q組的詢問,每組詢問兩個詞,回答他們之間的關系(同義詞輸出1,反義詞輸出2,沒關聯輸出3)。

思路:先用map把每個詞都編號好,然后只需要對這n個詞做個并查集就好。

開2n的數組,前半部分是本義,后半部分代表這個詞的反義詞的祖先。

如果第i個詞和第j個詞同義,那么i和j應該是同一個祖先,i+n和j+n應該同一個祖先; 如果第i個詞和第j個詞反義,那么i和j+n應該同一個祖先,i+n和j應該同一個祖先。

代碼:

#include <iostream>#include <map>#include <string>using namespace std;int father[200005];//祖先int finding(int x)//帶狀態壓縮的找祖先{ int fx=x; while(father[fx]!=fx) { fx=father[fx]; } while(father[x]!=x) { int t=x; x=father[x]; father[t]=fx; } return x;}void uni(int a,int b)//加入同一集合{ a=finding(a); b=finding(b); father[a]=b;}int main(){ map<string,int> mp; int n,m,q; while(cin>>n>>m>>q) { mp.clear(); for(int i=0 ; i<n ; i++) { string s; cin>>s; mp[s]=i; } for(int i=0 ; i<n ; i++) { father[i]=i; father[i+n]=i+n; } for(int i=0 ; i<m ; i++) { int t ; cin>>t; string s1,s2; cin>>s1>>s2; int a=mp[s1]; int b=mp[s2]; if(t==1)//同義 { if(finding(a)==finding(b+n)||finding(a+n)==finding(b)) { cout<<"NO"<<endl; } else { uni(a,b); uni(a+n,b+n); cout<<"YES"<<endl; } } else//反義 { if(finding(a)==finding(b)||finding(a+n)==finding(b+n)) { cout<<"NO"<<endl; } else { uni(a+n,b); uni(a,b+n); cout<<"YES"<<endl; } } } for(int i=0 ; i<q ; i++) { string s1,s2; cin>>s1>>s2; int a=mp[s1]; int b=mp[s2]; if(finding(a)==finding(b)) { cout<<1<<endl; } else if(finding(a)==finding(b+n)) { cout<<2<<endl; } else { cout<<3<<endl; } } } return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 监利县| 天峻县| 鄄城县| 嫩江县| 长岛县| 临江市| 哈尔滨市| 杨浦区| 临洮县| 平潭县| 峨眉山市| 九龙城区| 偏关县| 铜陵市| 乐清市| 松滋市| 铜山县| 遵化市| 古丈县| 西乌珠穆沁旗| 鹿泉市| 阿坝县| 嫩江县| 安乡县| 南安市| 贵州省| 库车县| 沿河| 鄱阳县| 汕尾市| 临洮县| 科尔| 山阳县| 呼图壁县| 灯塔市| 绥江县| 湘阴县| 石林| 扬州市| 宜宾县| 尤溪县|