题目:
链接:点击打开链接
思路:
把“=”两边的数合为一个集合,然后构建邻接表拓扑排序;冲突:出现相等又不相等 || 拓扑排序入度为0的点有多个)不确定:有独立的点)OK。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
#define MAXN 20020
struct node{
int data;
struct node *next;
}point[MAXN];
struct info{
int l,r;
char ch;
}edge[MAXN];
int total;
int n,m;
int root[MAXN],in[MAXN];
void init()
{
for(int i=0; i<n; i++)
{
point[i].data = i;
point[i].next = NULL;
root[i] = i;
in[i] = 0;
}
}
int findset(int x)
{
return root[x] == x ? x : root[x] = findset(root[x]);
}
void mergeset(int x,int y)
{
int fx = findset(x);
int fy = findset(y);
if(fx != fy)
{
if(fx > fy)
root[fy] = fx;
else
root[fx] = fy;
total--;
}
}
void add(int x,int y)
{
node *temp;
temp = (node*) malloc (sizeof(node));
temp->data = y;
temp->next = point[x].next;
point[x].next = temp;
}
int main()
{
//freopen("1.txt","r",stdin);
while(scanf("%d%d",&n,&m) != EOF)
{
init();
total = n;
for(int i=0; i<m; i++)
{
scanf("%d %c %d",&edge[i].l,&edge[i].ch,&edge[i].r);
if(edge[i].ch == '=')
{
mergeset(edge[i].l,edge[i].r);
}
}
bool flag = true;
for(int i=0; i<m; i++)
{
if(edge[i].ch == '=')
continue;
int x = findset(edge[i].l);
int y = findset(edge[i].r);
if(x == y)
flag = false;
if(edge[i].ch == '>')
{
add(x,y);
in[y]++;
}
else
{
add(y,x);
in[x]++;
}
}
queue<int> q;
for(int i=0; i<n; i++)
{
if(in[i] == 0 && findset(i) == i)
q.push(i);
}
int mark = 0;
while(!q.empty())
{
if(q.size() > 1)
mark = 1;
int fr = q.front();
q.pop();
total--;
for(node* u=point[fr].next; u; u=u->next)
{
if(--in[u->data] == 0)
q.push(u->data);
}
}
if(!flag || total > 1)
printf("CONFLICT\n");
else if(mark)
printf("UNCERTAIN\n");
else
printf("OK\n");
}
return 0;
}
----------------------------------------------------------------------
奋斗,永不停歇;战斗,从不退缩~~~~~~~~~~~~~~