直接抄代码了,因为实在是不知道怎么做啊,要转换成关系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; }