枚举法
代码如下:
#include<stdio.h>
#include<string.h>
int left[102][502];
int right[102][502];
int a[102];
short r[1001];
char c[102];
int n,k,num;
int result=0,index;
int isgreat(int i)
{
int j,flag,m;
for(j=0;j<k;j++)
{
if(c[j]=='<')
{
flag=0;
for(m=0;m<a[j];m++)
{
if(right[j][m]==i)
{
flag=1;break;
}
}
if(flag==0)
return 0;
}
if(c[j]=='>')
{
flag=0;
for(m=0;m<a[j];m++)
{
if(left[j][m]==i)
{
flag=1;break;
}
}
if(flag==0)
return 0;
}
}
return 1;
}
int islittle(int i)
{
int j,flag,m;
for(j=0;j<k;j++)
{
if(c[j]=='<')
{
flag=0;
for(m=0;m<a[j];m++)
{
if(left[j][m]==i)
{
flag=1;break;
}
}
if(flag==0)
return 0;
}
if(c[j]=='>')
{
flag=0;
for(m=0;m<a[j];m++)
{
if(right[j][m]==i)
{
flag=1;break;
}
}
if(flag==0)
return 0;
}
}
return 1;
}
void myenum()
{
int i;
for(i=1;i<=n;i++)
{
if(r[i])
continue;
else if(isgreat(i))
{
result++;index=i;
}
else if(islittle(i))
{
result++;index=i;
}
}
if(result!=1)
printf("0\n");
else
printf("%d\n",index);
}
int main()
{
int count,i;char cr;
scanf("%d %d",&n,&k);
memset(r,0,sizeof(r));
for(count=0;count<k;count++)
{
scanf("%d",&num);
for(i=0;i<num;i++)
scanf("%d",&left[count][i]);
for(i=0;i<num;i++)
scanf("%d",&right[count][i]);
a[count]=num;
scanf("%c",&c[count]);
scanf("%c",&c[count]);
if(c[count]=='=')
{
for(i=0;i<num;i++)
r[left[count][i]]=r[right[count][i]]=1;
}
}
myenum();
return 0;
}