使用队列,核心思想还是找到矛盾的地方,用一个一维数组保存种类,一个二维数组保存关系,如果遍历之后,两种蝴蝶种类的异或与关系矩阵中的内容不符合,那么就是有矛盾,不可能实现。
#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;
}
继续阅读与本文标签相同的文章
-
尘埃落定!美盟友明确表示不排除华为5G:特朗普颜面尽失!
2026-05-18栏目: 教程
-
“中本聪”一词被收入牛津英语词典
2026-05-18栏目: 教程
-
中山5G建设传重磅消息!市民何时能用?时间定了!
2026-05-18栏目: 教程
-
调查显示中国88%员工信任机器人超过经理
2026-05-18栏目: 教程
-
在如今,人们谈到科技,可能最先想到的就是电子技术
2026-05-18栏目: 教程
