Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1334 Accepted Submission(s): 540
Special Judge
//把立方体的六个面看成6个点,每个立方体都有自己的约束条件(x1<x2,y1<y2,z1<z2),立方体之间又有 //约束条件,这样三维坐标分成三部分建图,拓扑排序,排在后面的比排在前面的多加1单位长度. #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> using namespace std; const int maxn=2005; int n,m,in[3][maxn],val[3][maxn]; vector<int>g[3][maxn]; void init() { for(int i=0;i<3;i++){ for(int j=1;j<=n*2;j++){ in[i][j]=val[i][j]=0; g[i][j].clear(); } } for(int i=0;i<3;i++){ for(int j=1;j<=n;j++){ in[i][j+n]++; g[i][j].push_back(j+n); } } } bool topo() { for(int i=0;i<3;i++){ queue<int>q; int cnt=0; for(int j=1;j<=n;j++) if(in[i][j]==0){ val[i][j]=cnt++; q.push(j); } while(!q.empty()){ int a=q.front();q.pop(); for(int j=0;j<(int)g[i][a].size();j++){ int b=g[i][a][j]; val[i][b]=max(val[i][b],val[i][a]+1);//! if(--in[i][b]==0){ q.push(b);cnt++; } } } if(cnt!=n*2) return 0; } return 1; } int main() { int cas=0; while(scanf("%d%d",&n,&m)&&(n+m)){ init(); char ch[5];int a,b; while(m--){ scanf("%s%d%d",ch,&a,&b); if(ch[0]==‘I‘){ for(int i=0;i<3;i++){ in[i][a+n]++;g[i][b].push_back(a+n); in[i][b+n]++;g[i][a].push_back(b+n); } } else if(ch[0]==‘X‘){ in[0][b]++;g[0][a+n].push_back(b); } else if(ch[0]==‘Y‘){ in[1][b]++;g[1][a+n].push_back(b); } else{ in[2][b]++;g[2][a+n].push_back(b); } } printf("Case %d: ",++cas); if(topo()){ printf("POSSIBLE\n"); for(int i=1;i<=n;i++) printf("%d %d %d %d %d %d\n",val[0][i],val[1][i],val[2][i],val[0][i+n],val[1][i+n],val[2][i+n]); } else printf("IMPOSSIBLE\n"); printf("\n"); } return 0; }
原文:http://www.cnblogs.com/--ZHIYUAN/p/6492539.html