AcWing 237. 程序自动分析(并查集+离散化)
作者:互联网
题目描述
题目思路
- 先进行离散化(题目中给的数据范围很大,但需要用到的很少),109 ==> 2 × 106
- 离散化方式:
- 若要求保序:排序、判重、二分
- 若不要求保序,用map
- 本题约束条件的顺序无所谓,则先考虑所有相等的约束条件(一定无矛盾),再考虑不相等的约束条件
- 相等则放在一个集合中,不相等就判断其是否在一个集合里
题目代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
const int N = 2000010;
int n, m;
int p[N];
unordered_map<int, int> S;
struct Query
{
int x, y, e;
}query[N];
int get(int x) // 离散化
{
if (S.count(x) == 0) S[x] = ++ n;
return S[x];
}
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
int T;
scanf("%d", &T);
while (T -- )
{
n = 0;
S.clear();
scanf("%d", &m);
for (int i = 0; i < m; i ++ )
{
int x, y, e;
scanf("%d%d%d", &x, &y, &e);
query[i] = {get(x), get(y), e};
}
for (int i = 1; i <= n; i ++ ) p[i] = i;
// 合并所有相等约束条件
for (int i = 0; i < m; i ++ )
if (query[i].e == 1)
{
int pa = find(query[i].x), pb = find(query[i].y);
p[pa] = pb;
}
// 检查所有不等条件
bool has_conflict = false;
for (int i = 0; i < m; i ++ )
if (query[i].e == 0)
{
int pa = find(query[i].x), pb = find(query[i].y);
if (pa == pb)
{
has_conflict = true;
break;
}
}
if (has_conflict) puts("NO");
else puts("YES");
}
return 0;
}
标签:237,题目,get,int,scanf,查集,离散,include,AcWing 来源: https://www.cnblogs.com/esico/p/16493679.html