# 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}\) 已经同属一个连通块则无解,反之则有解


两种解法本质思想一致

posted @ 2020-07-26 09:18  熹圜  阅读(74)  评论(0编辑  收藏  举报