《拓扑排序》hdu acm 5.1.6 精妙

#include<stdio.h>  
#include<vector>  
#include<queue>  
using namespace std; const int N = 2005;  
  
vector<int>mapt[3][N]; int in[3][N],v[3][N],n; void init() { for(int i=0;i<3;i++) for(int j=1;j<=n*2;j++)  
        in[i][j]=v[i][j]=0,mapt[i][j].clear(); for(int i=0;i<3;i++) for(int j=1;j<=n;j++) {  
            in[i][j+n]++; mapt[i][j].push_back(j+n); } } int topeSort() { for(int i=0;i<3;i++) { int k=0;  
        queue<int>q; for(int j=1;j<=n;j++) if(in[i][j]==0)  
            q.push(j),v[i][j]=k++; while(!q.empty()) { int s=q.front(); q.pop(); int len=mapt[i][s].size(); for(int j=0; j<len; j++) { int tj=mapt[i][s][j];  
                in[i][tj]--; if(v[i][s]+1>v[i][tj])  
                    v[i][tj]=v[i][s]+1; if(in[i][tj]==0)  
                    q.push(tj),k++; } } if(k!=n*2) return 0; } return 1; } int main() { char ch[5]; int m,a,b,cas=0; while(scanf("%d%d",&n,&m)>0&&n+m!=0) {  
        init(); while(m--) {  
            scanf("%s%d%d",ch,&a,&b); if(ch[0]=='I') { for(int i=0;i<3;i++) {  
                    mapt[i][a].push_back(b+n); in[i][b+n]++;  
                    mapt[i][b].push_back(a+n); in[i][a+n]++; } } else if(ch[0]=='X')  
                mapt[0][a+n].push_back(b),in[0][b]++; else if(ch[0]=='Y')  
                mapt[1][a+n].push_back(b),in[1][b]++; else if(ch[0]=='Z')  
                mapt[2][a+n].push_back(b),in[2][b]++; }  
  
        printf("Case %d: ",++cas); if(topeSort()==0)  
            printf("IMPOSSIBLE\n"); else {  
            printf("POSSIBLE\n"); for(int i=1;i<=n;i++) {  
                printf("%d",v[0][i]); for(int j=1;j<3;j++)  
                    printf(" %d",v[j][i]); for(int j=0;j<3;j++)  
                    printf(" %d",v[j][i+n]);  
                printf("\n"); } }  
        printf("\n"); } }

你可能感兴趣的:(《拓扑排序》hdu acm 5.1.6 精妙)