ARC 065D Connectivity 并查集+map

来源:互联网 发布:淘宝消字灵是真的么 编辑:程序博客网 时间:2024/06/06 19:03

点击打开链接

//题意:求出i->j既可以通过roads到达又可以通过railways达到的city数量(自己和本身connect)
//先用并查集分好成两组A,B(road,railway),如何快速求出每个i对应的j的数量? ((i,j)在A是联通的&&在B也联通的) 


//即如果i两组的祖先为x,y j的祖先也为x,y则i->j在两组都即可通过road也可以通过railway(i->x->j),(i-y->j)
//(i,j)满足条件当且仅当(x,y)相等,用map记录每个i的祖先(xi,yi)的出现次数即可,复杂度为(O(nlogn)) 

#include <bits/stdc++.h>using namespace std;typedef pair<int,int> P;typedef long long ll;const int N=2e5+20;const int M=30;struct Union_find{Union_find(int n){par.resize(n);for(int i=0;i<n;i++) par[i]=i;}int find(int x){return (par[x]==x)?x:par[x]=find(par[x]);}void unite(int a,int b){a=find(a),b=find(b);par[a]=b;}bool same(int a,int b){return find(a)==find(b);}vector<int> par;};int main(){int n,k,l;cin>>n>>k>>l;Union_find uf1(n);for(int i=0;i<k;i++){int u,v;cin>>u>>v;uf1.unite(u-1,v-1);//vector par[i]从0开始标号 }Union_find uf2(n);for(int i=0;i<l;i++){int p,q;cin>>p>>q;uf2.unite(p-1,q-1);}map<P,int> mp;for(int i=0;i<n;i++){mp[make_pair(uf1.find(i),uf2.find(i))]++;}for(int i=0;i<n;i++){cout<<mp[make_pair(uf1.find(i),uf2.find(i))]; if(i==n-1)cout<<endl;elsecout<<' ';}return 0;} 


0 0
原创粉丝点击