文章
26
粉丝
407
获赞
0
访问
333.8k
程序自动分析:
(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...
登录后发布评论
暂无评论,来抢沙发