链接
解析
先预处理,就是相等的时候,用并查集处理相等的点,之后在处理’>’、’<’的情况,若先不处理相等的情况,会出现建边错误。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 100000+10;
int num;
typedef long long LL;
int fa[maxn];
vector<int>g[maxn];
int deg[maxn];
void init() {
for (int i=0; i<maxn; i++)
fa[i] = i, g[i].clear(), deg[i] = 0;
}
int Find(int x) {
return x==fa[x]?x:fa[x] = Find(fa[x]);
}
void Union(int u, int v) {
u = Find(u);
v = Find(v);
if (u != v)
fa[u] = v;
}
int n;
void topsort(int &flag) {
queue<int>q;
for (int i=0; i<n; i++) {
if (Find(i) == i && deg[i] == 0)
q.push(i);
}
while (!q.empty()) {
int u = q.front();
num--;
q.pop();
if (!q.empty())
flag = 1;
for (int i=0; i<g[u].size(); i++) {
int v = g[u][i];
deg[v]--;
if (deg[v] == 0)
q.push(v);
}
}
}
int U[maxn], V[maxn];
char c[maxn];
int main()
{
int m;
while (scanf("%d%d", &n, &m)!=EOF) {
init();
num = n;
for (int i=0; i<m; i++) {
scanf("%d %c %d", &U[i], &c[i], &V[i]);
int u=Find(U[i]), v = Find(V[i]);
if (c[i] == '=' && u != v)
Union(u, v), num--;
}
for (int i=0; i<m; i++) {
int u = Find(U[i]), v=Find(V[i]);
if (c[i] == '>')
{
deg[v]++;
g[u].push_back(v);
}
else if (c[i] == '<')
{
deg[u]++;
g[v].push_back(u);
}
}
int flag = 0;
topsort(flag);
if (num > 0)
puts("CONFLICT");
else if (flag == 1)
puts("UNCERTAIN");
else
puts("OK");
}
return 0;
}