HDU 3213 Box Relations(拓扑排序构造)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3231

题意:有n个长方体,四种限制条件。(1)I x y x和y有相交;(2)X/Y/Z  x y x的最大X/Y/Z坐标小于y的最大X/Y/Z。构造出这样的n个长方体。

思路:首先,XYZ三个方向是可以分开考 虑的。那么我们可以一个个分别求解。将每个长方体拆成左上角右下角两个点,我们假设现在考虑X方向,也即是一个长方体对应两个X方向的点,共2*n个点, 边<i,j>表示i小于j,那么首先有边<i,i+n>,即同一个长方体的左下角的点的x坐标必然小于其右上角的x坐标。对于相 交的x和y有<x,y+n> <y,x+n>,对于不相交的有<x+n,y>。然后就是判断是不是拓扑图就行了。是的话依次按照0,1,2开始标号。

vector<int> g[3][N];
int d[3][N],ans[3][N],n,m;

void Add(int i,int u,int v)
{
    g[i][u].pb(v);
    d[i][v]++;
}

void build()
{
    int i,j,x,y;
    FOR0(i,3) FOR0(j,N) g[i][j].clear(),d[i][j]=0;
    char op[5];
    FOR0(i,3) FOR1(j,n) Add(i,j,j+n);
    while(m--)
    {
        RD(op); RD(x,y);
        if(op[0]==‘I‘)
        {
            FOR0(i,3) Add(i,x,y+n),Add(i,y,x+n);
        }
        else Add(op[0]-‘X‘,x+n,y);
    }
}

int top_sort(int t)
{
    int cnt=0;
    queue<int> Q;
    int i,j,u;
    FOR1(i,n+n) if(!d[t][i]) ans[t][i]=cnt++,Q.push(i);
    while(!Q.empty())
    {
        j=Q.front();
        Q.pop();
        FOR0(i,SZ(g[t][j]))
        {
            u=g[t][j][i];
            if(--d[t][u]==0) Q.push(u),ans[t][u]=cnt++;
        }
    }
    return cnt==n+n;
}

void deal()
{
    int i;
    FOR0(i,3) if(!top_sort(i))
    {
        puts("IMPOSSIBLE");
        return;
    }
    puts("POSSIBLE");
    FOR1(i,n) printf("%d %d %d %d %d %d\n",ans[0][i],ans[1][i],ans[2][i],ans[0][i+n],ans[1][i+n],ans[2][i+n]);
}

int main()
{
    int num=0;
    Rush(n)
    {
        RD(m);
        if(!n&&!m) break;
        build();
        printf("Case %d: ",++num);
        deal(); puts("");
    }
}

HDU 3213 Box Relations(拓扑排序构造),布布扣,bubuko.com

时间: 2024-08-07 08:35:58

HDU 3213 Box Relations(拓扑排序构造)的相关文章

hdu 4857 逃生 (拓扑排序+保证最小在前面)

逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 74    Accepted Submission(s): 13 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前. 同时,社会是不平

HDU 4324:Triangle LOVE( 拓扑排序 )

Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2271    Accepted Submission(s): 946 Problem Description Recently, scientists find that there is love between any of two people. For

HDU 4857 (反向拓扑排序 + 优先队列)

题意:有N个人,M个优先级a,b表示a优先于b,并且每个人有个编号的优先级,输出顺序. 思路来自:与PKU3687一样 在基本的拓扑排序的基础上又增加了一个要求:编号最小的节点要尽量排在前面:在满足上一个条件的基础上,编号第二小的节点要尽量排在前面:在满足前两个条件的基础上,编号第三小的节点要尽量排在前面--依此类推.(注意,这和字典序是两回事,不可以混淆.) 如图 1 所示,满足要求的拓扑序应该是:6 4 1 3 9 2 5 7 8 0. 图 1 一个拓扑排序的例子 一般来说,在一个有向无环图

Hdu 3231 Box Relations(拓扑排序)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3231 思路:拓扑排序.将每个长方体的每对面看成一条线段,将线段看成两个点,则共有3条线段,6个点. 对于一组相交关系,若两个长方体相交,当且仅当每一维中一个长方体的面插入另一个长方体的内部. 将长方体分为左右,上下,前后三维. 例如一长方形设左面为x,右面为x+n,另一长方体左面为y,右面为y+n,则在该维中坐标x<y+n,y<x+n,x<x+n,其他两维同理. 则由大小关系,分别对每一维拓

LA-4255 Guess (拓扑排序+构造)

题目大意:一个未知的整数序列,给出其任意一个区间和的正负,还原这个序列.任意一个满足条件的序列即可. 题目分析:将连续区间和转化为前缀和之差,sumx-1与sumy的大小关系已知,以此建立一条有向边,做拓扑排序.根据sum0=0,可以构造出所有的前缀和,再取两前缀和之差便得答案. 代码如下: # include<iostream> # include<cstdio> # include<queue> # include<vector> # include&l

hdu 4857 逃生(拓扑排序逆序 + 优先队列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 题意:有编号 1 - n 的 n 个人逃生,编号越小的人越有钱, 在满足 m 个前提的条件下要尽可能早的逃脱 .m个前提,对于每个前提 a , b,代表 a 要早于 b逃脱. 思路: (1)这题可以理解为有钱的人优先级越高,所以可以用优先队列. (2)但是要注意这道题和字典序升序的区别. eg:5 1 5 1 按照字典序的答案:2 3 4 5 1,    本题答案: 5 1 2 3 4. 因为

HDU 5438 Ponds (拓扑排序+DFS)2015 ACM/ICPC Asia Regional Changchun Online

[题目链接]:click here~~ [题目大意]: 题意:在一个无向图中有 p 个点, m 条边,每个点有一个值 vi .不断的删去度数小于2的点直到不能删为止.求新图中所有点个数为奇数的连通分量的点值的和. 1<p<10^4,1<m<10^5 [思路]删边考虑类似拓扑排序的写法,不过topsort是循环一遍1到n结点入度为0的结点,然后加入到队列中,这里只要改一下度数小于等于1,最后DFS 判断一下 挫挫的代码: /* * Problem: HDU No.5438 * Run

HDU 4857 逃生(拓扑排序逆向+邻接表存图)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 题目: Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有的富.1号最富,2号第二富,以此类推.有钱人就贿赂负责人,所以他们有一些好处. 负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,

hdu 4857 逃生 (拓扑排序+优先队列)

逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 688    Accepted Submission(s): 190 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平