直接抄代码了,因为实在是不知道怎么做啊,要转换成关系top,自己打死也想不到啊。。
code:
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 2010 ;
struct node
{
int to,next;
}relations[100010];
int n,cnt,adj[4][MAXN];
int in[4][MAXN];
void add_relations(int type,int from,int to)
{
relations[cnt].to=to;
relations[cnt].next=adj[type][from];
adj[type][from]=cnt++;
in[type][to]++; //对to这个顶点的入度加1
}
void init()
{
cnt=1;
memset(in,0,sizeof(in));
memset(adj,0,sizeof(adj));
int i, j;
for(i=1;i<=n;i++)
{
for(j=1;j<=3;j++)
{
add_relations(j,i,i+n);
}
}
}
int q[4][MAXN],ans[4][MAXN];
bool topsort(int type)
{
int front,top,i;
front=top=0;
for(i=1;i<=2*n;i++)
{
if(!in[type][i])
{
q[type][top++]=i;
in[type][i]--;
}
}
while(front<top)
{
int from=q[type][front++];
for(i=adj[type][from];i;i=relations[i].next)
{
int to = relations[i].to;
in[type][to]--;
if(!in[type][to])
{
q[type][top++]=to;
in[type][to]--;
}
}
}
return top == 2*n;
}
void solve()
{
int i,j;
for(i=1;i<=3;i++)
{
if(!topsort(i))
{
puts("IMPOSSIBLE");
return ;
}
}
puts("POSSIBLE");
for(j=1;j<=3;j++)
for(i=0;i<2*n;i++)
ans[j][q[j][i]]=i;
for(int i=1;i<=n;i++)
{
printf("%d %d %d ",ans[1][i],ans[2][i],ans[3][i]);
printf("%d %d %d\n",ans[1][i+n],ans[2][i+n],ans[3][i+n]);
}
}
int main()
{
char ch[2];
int m,a,b,i,cas=1;
while(~scanf("%d%d",&n,&m) && (n+m) )
{
init();
while(m--)
{
scanf("%s%d%d",ch,&a,&b);
if(ch[0]=='I')
{
for(i=1;i<=3;i++)
{
add_relations(i,a,b+n);
add_relations(i,b,a+n);
}
}else{
add_relations(ch[0]-'X'+1,a+n,b);
}
}
printf("Case %d: ",cas++);
solve();
puts("");
}
return 0;
}