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

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

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

2019-11-10 22:57:47
字體:
來源:轉載
供稿:網友

題目鏈接: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;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 斗六市| 宽城| 长汀县| 南康市| 万安县| 含山县| 吉木萨尔县| 洛南县| 朝阳市| 渑池县| 耒阳市| 修水县| 平潭县| 阿鲁科尔沁旗| 平南县| 青海省| 博罗县| 莱阳市| 姚安县| 阳原县| 江西省| 勃利县| 仁寿县| 永仁县| 元氏县| 通辽市| 奇台县| 海盐县| 三门县| 巨鹿县| 鄂尔多斯市| 醴陵市| 衡阳县| 肥乡县| 东源县| 吕梁市| 灯塔市| 顺昌县| 济源市| 南雄市| 靖西县|