使用队列,核心思想还是找到矛盾的地方,用一个一维数组保存种类,一个二维数组保存关系,如果遍历之后,两种蝴蝶种类的异或与关系矩阵中的内容不符合,那么就是有矛盾,不可能实现。
#include <cstring>
#include <iostream>
#include <queue>
#include <math.h>
#include <vector>
#include <algorithm>
#include <map>
#define MAX_N 1010
#define MAX_M 100010
using namespace std;
int n, m;
bool visited[MAX_N];
bool typee[MAX_N];
int relations [MAX_N][MAX_N];
int a, b, c;
int main()
{
while (scanf("%d%d", &n, &m)!=EOF) {
memset(visited, false, sizeof(visited));
memset(typee, true, sizeof(typee));
memset(relations, -1, sizeof(relations));
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &a, &b, &c);
relations[a][b] = relations[b][a] = c;
}
int visnum = 0, cur;
queue<int> q;
while (visnum != n) {
for (int i = 0; i < n; i++) {
if (!visited[i]) {
q.push(i);
visnum++;
visited[i] = true;
break;
}
}
if (visnum == n) {
break;
}
while (!q.empty()) {
cur = q.front();
q.pop();
for (int i = 0; i < n; i++) {
if (relations[cur][i] != -1) {
if (!visited[i]) {
if (relations[cur][i] == 0) {
typee[i] = typee[cur];
}else{
typee[i] = !typee[cur];
}
q.push(i);
visnum++;
visited[i] = true;
}
}
}
}
}
bool flag = true;
for (int i = 0; flag && i < n; i++) {
for (int j = 0; flag && j < n; j++) {
if (relations[i][j] == -1) {
continue;
}
if (relations[i][j] != (typee[i] ^ typee[j])) {
flag = false;
}
}
}
if (flag) {
cout << "YES\n";
}else{
cout << "NO\n";
}
}
return 0;
}