zoukankan      html  css  js  c++  java
  • 【拓扑排序】【HDU3231】【Box Relations】

    题目大意:

    N个盒子

    给你K个以下关系

    1.A和B有重叠

    2.A在B的左边且不重叠

    3.A在B的前边且不重叠

    4.A在B的上面且不重叠


    显然单独分配X坐标处理2(x1<x2<x1'<x2'),Y坐标处理3(同上),Z坐标处理4(同上)。


    1操作怎么处理? X,Y,Z都要处理,A和B 要重叠  必须X,Y,Z都符合夹着的样 (x1<x2'&&x1'<x2)(y,z同理)


    所以就是给你很多x1,x2,y1,y2,z1,z2关系 求满足关系的东西,查分约束,或这里直接用拓扑排序


    然后对X,Y,Z建图(x1,x2为一组),拓扑。


    代码直接COPY了

    {

    #include <queue>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    #define N 2005
    
    struct T
    {
        int v,next;
    }E[3][N*100];
    
    struct TT
    {
        int head,rd,dep;
    }V[3][N];
    
    int top[3],ans,n,m;
    
    void Add_Edge(int k,int u,int v)
    {
        E[k][top[k]].v = v;
        E[k][top[k]].next = V[k][u].head;
        V[k][u].head = top[k]++;
        ++V[k][v].rd;
    }
    
    bool Top_Sort(int k)
    {
        queue<int> Q;
        for(int i=1;i<=n;i++)
            if(V[k][i].rd == 0)
                Q.push(i);
        int cnt = 0;
        while(!Q.empty())
        {
            ++cnt;
            int p = Q.front();
            for(int i=V[k][p].head;i!=NULL;i=E[k][i].next)
            {
                int q = E[k][i].v;
                --V[k][q].rd;
                if(V[k][q].rd == 0)
                {
                    Q.push(q);
                    V[k][q].dep = V[k][p].dep + 1;
                }
            }
            Q.pop();
        }
        return cnt == n;
    }
    int main()
    {
        int u,v,nn,ncase=0;
        char cmd;
        while(~scanf("%d%d%*c",&nn,&m),nn)
        {
            memset(V,0,sizeof(V));
            top[0] = top[1] = top[2] = 1;
            n = 2*nn;
            for(int k=0;k<3;k++)
                for(int i=1;i<=nn;i++)
                    Add_Edge(k,i,i+nn);
            while(m--)
            {
                scanf("%c%d%d%*c",&cmd,&u,&v);
                if(cmd == 'I')
                {
                    for(int k=0;k<3;k++)
                    {
                        Add_Edge(k,u,v+nn);
                        Add_Edge(k,v,u+nn);
                    }
                }
                else
                    Add_Edge(cmd-'X',u+nn,v);
            }
            printf("Case %d: ",++ncase);
            if(!Top_Sort(0) || !Top_Sort(1) || !Top_Sort(2))
                puts("IMPOSSIBLE
    ");
            else
            {
                puts("POSSIBLE");
                for(int i=1;i<=nn;i++)
                    printf("%d %d %d %d %d %d
    ",V[0][i].dep,V[1][i].dep,V[2][i].dep,V[0][i+nn].dep,V[1][i+nn].dep,V[2][i+nn].dep);
                puts("");
            }
        }
        return 0;
    }

    }

  • 相关阅读:
    UDP and netstat
    UDP learn by Python3
    UDP headers and checksum
    routetrace
    IPv4 headers
    Commands for IP
    IP checksum
    POJ 3667 Hotel 线段树处理区间信息
    【枚举】Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) Div2C题
    二分图最大匹配模板 HDU1083
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480366.html
Copyright © 2011-2022 走看看