# BZOJ4195_程序自动分析
题意:
给定 \(n\) 个约束,每个约束形如:\(x_{i}=x_{j}\) 或 \(x_{i}\ne x_{j}\)
询问是否存在对于 \(\{x\}\) 的一组赋值满足所有约束条件
解:
解法①【并查集】:
考虑用并查集把所有值相等的 \(x_{k}\) 扔进同一个集合
枚举每个相等关系 \(x_{i}=x_{j}\) ,合并 \(x_{i}\) 所在的集合和 \(x_{j}\) 所在的集合
然后枚举每个不等关系 \(x_{i}\ne x_{j}\) ,若发现 \(x_{i}\) 与 \(x_{j}\) 已经同属一个集合则无解,反之则有解
解法②【dfs分连通块】:
考虑抽象每个 \(x_{k}\) 为一个节点
枚举每个相等关系 \(x_{i}=x_{j}\) ,在节点 \(i\) 和节点 \(j\) 之间连无向边
一遍dfs划分连通块
再枚举每个不等关系 \(x_{i}\ne x_{j}\) ,若发现 \(x_{i}\) 与 \(x_{j}\) 已经同属一个连通块则无解,反之则有解