算法提高之程序自动分析
-
核心思想:并查集 + 离散化
- 因为不是每个数都会用到 所以离散化一下**(不需要保留顺序)**
- 对于每一个值为1的等式 优先处理
- 之后处理值为0的等式时 若ab已经连在一起 即为矛盾
-
#include <iostream> #include <cstring> #include <algorithm> #include <unordered_map> using namespace std; const int N = 200010; int p[N]; int n,m,T; unordered_map<int,int> S; struct Query { int x, y, e; }query[N]; int find(int x) // 并查集 { if (p[x] != x) p[x] = find(p[x]); return p[x]; } int get(int x) //离散化 { if(S.count(x) == 0) S[x] = ++n; return S[x]; } int main() { cin>>T; while(T--) { n = 0; S.clear(); cin>>m; for(int i=0;i<m;i++) { int a,b,c; cin>>a>>b>>c; query[i] = {get(a),get(b),c}; } for(int i=0;i<=n;i++) p[i] = i; for(int i=0;i<m;i++) { if(query[i].e == 1) //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"); } }