ARC 065D Connectivity 并查集+map

点击打开链接

//题意:求出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;
		else
		cout<<' ';
	}
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值