现在的位置: 首页 > 综合 > 正文

hdu3231 Box Relations

2018年04月23日 ⁄ 综合 ⁄ 共 1381字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.