题目大意就是在每个 dislikes[i]
里面的两个人不能分到同一组。那我们就为这两个人对应的编号构建两个节点,并在这两个节点之间连接一条线。处理完成之后,我们要做的就是把所有的点分成两组,这两组之间可以存在连线,而组内不能存在任何连线。
我们可以用颜色法来判断这个图是否满足这样的性质。
class Solution {
const static int maxn = 2005;
int h[maxn], e[maxn*maxn], ne[maxn*maxn];
int tot;
short color[maxn];
void add(int u, int v) {
++tot;
e[tot] = v;
ne[tot] = h[u];
h[u] = tot;
}
bool dfs(int u, short c) {
color[u] = c;
for(int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if(!color[j]) {
if(!dfs(j, 3-c)) return false;
} else if(color[j] == c) return false;
}
return true;
}
public:
bool possibleBipartition(int n, vector<vector<int>>& dislikes) {
tot = -1;
for(int i = 0; i <= n; ++i) { h[i] = -1; color[i] = 0; }
for(int i = 0; i < dislikes.size(); ++i) {
add(dislikes[i][0], dislikes[i][1]);
add(dislikes[i][1], dislikes[i][0]);
}
bool flag = true;
for(int i = 1; i <= n; ++i) {
if(!color[i]) {
if(!dfs(i, 1)) {
flag = false;
break;
}
}
}
return flag;
}
};