先鄙视一下自己哎~~忘初始化一个数组结果一直wa对照别人代码找了好久~~~
这是一道很好的题,考验自己的基本功~~先是用邻接矩阵结果内存超出~~~~写邻接表花了好一阵~~~
一下代码:
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int parent[10005];
int l[20005],r[20005];
char c[20005];
int in [10005];
int find1(int i)
{
while(i!=parent[i])
i=parent[i];
return i;
}
void merge(int i,int j,int &count)
{
i=find1(i);
j=find1(j);
if(i!=j)
{
parent[i]=j;
count++;
}
}
struct Node
{
int data;
Node *next;
Node():data(0),next(0){}
}*m[10005];
void addege(int i,int j)
{
Node *t= new Node;
t->data=j;
t->next=m[i];
m[i]=t;
}
void init(int n)
{
int i;
for(i=0;i<n;i++)
parent[i]=i;
memset(in,0,sizeof(in));
memset(m,0,sizeof(m));
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
int i;
init(n);
int count=0;
for(i=0;i<k;i++)
{
scanf("%d %c %d",&l[i],&c[i],&r[i]);
if(c[i]=='=')
merge(l[i],r[i],count);
}
int flag1=0,flag2=0;
for(i=0;i<k;i++)
{
if(c[i]=='=')
continue;
int x=find1(l[i]);
int y=find1(r[i]);
if(c[i]=='>')
{
addege(x,y); //这里如果把一组加入了两次,则in也会多加,结果在减的时候正好多减所以不影响。
in[y]++;
}
else
{
addege(y,x);
in[x]++;
}
}
queue<int> q;
for(i=0;i<n;i++)
{
if(in[i]==0&&find1(i)==i)
q.push(i);
}
if(q.size()>=2)
flag1=1; //tiaojianbuzu;
while(!q.empty())
{
int t=q.front();
q.pop();
count++;
Node *s;
for(s=m[t];s;s=s->next)
{
in[s->data]--;
if(in[s->data]==0)
{
q.push(s->data);
if(q.size()>=2)
flag1=1;
}
}
}
if(count<n)
flag2=1;
if(!flag1&&!flag2)
printf("OK\n");
else if(flag1&&flag2)
printf("CONFLICT\n");
else if(flag2)
printf("CONFLICT\n");
else
printf("UNCERTAIN\n");
}
return 0;
}