文章

26

粉丝

407

获赞

0

访问

320.1k

头像
并查集+离散化
经验总结
发布于2020年4月19日 00:59
阅读数 11.6k

程序自动分析:

(1)并查集(路径压缩)+离散化(数据过大):

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 2e6 + 10;
vector<pair<int, int>>a, b;//a存放相等的约束条件,b存放不相等的约束条件
int father[N], id[N];//father用于并查集,id用于离散化映射
int x, y, c;//每一组约束条件输入
int t, n, m;//t表示测试用例个数,n表示约束条件的个数,m表示离散化id数组的元素个数
/* findfather(int x){//时间复杂度过大
	while (x != father[x]){
		x = father[x];
	}
	return father[x];
}*/
int findfather(int x) {//采用路径压缩
	return x == father[x] ? x : (father[x] = findfather(father[x]));
}
int getId(int x){
	return lower_bound(id + 1, id + 1 + m, x) - id;
}

void solve(){
	for (int i = 1; i <= m; i++){
		father[i] = i;
	}
	for (int i = 0; i < a.size(); i++){//相等约束条件将相等的元素放在同一个集合
		int x = getId(a[i].first); int y = getId(a[i].second);//获得数组下标
		int x_father = findfather(x); int y_father = findfather(y);
		father[x_father] = y_father;
	}
	for (int i = 0; i < b.size(); i++){
		int x = getId(b[i].fi...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发