HDU3231 Box Relations——三维拓扑刨铣

HDU3231 Box Relations

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

题目意思:在一个三维空间上有一些棱和坐标轴平行的立方体。给够给予四种关系。I i j表示i,j两个立方体是有部分的重合,X i j表示立方体i所有点x坐标都小于立方体j的x坐标,Y i j表示立方体i所有点y坐标都小于立方体j的y坐标,Z i j表示立方体i所有点Z坐标都小于立方体j的Z坐标。然后给出一系列这样的关系,问你这些关系是否存在矛盾,如果不矛盾,对于每个立方体输出六个参数x1,y1,z1,x2,y2,z2,分别代表x坐标的下界,y坐标的下界,z坐标的下界,x坐标的上界,y坐标的上界,z坐标的上界。

思路:在每个维度上分别拓扑排序。具体思路还没有想的特别懂,大概明年了。还没想好怎么总结。这个坑以后再来补好了。

代码 :

//Author: xiaowuga
#include <bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
const long long N=2000+10;
using namespace std;
typedef long long LL;
vector<int>mapt[3][N];//3代表三个维度
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++)//坐标x,y,z
        for(int j=1;j<=n;j++){//盒子j,用两个点来表示,点j和j+n
            in[i][j+n]++;
            mapt[i][j].push_back(j+n);//点j的坐标比相应的点j+n的坐标小
        }
}

int topo(){
    for(int i;i<3;i++){
        int k=0;
        queue<int>q;
        for(int j=1;j<=n;j++){
            if(in[i][j]==0){
                q.push(j);
                k++;//对于入度为0的起点,作为拓扑起点
            }
        }
        //拓扑套路
        while(!q.empty()){
            int s=q.front();q.pop();
            for(int j=0;j<mapt[i][s].size();j++){
                int t=mapt[i][s][j];
                if(v[i][s]+1>v[i][t]) v[i][t]=v[i][s]+1;//t是s的后续所以s一定比t大是不合理的,所以我们需要更新t节点的坐标至少为s的坐标+1
                if(--in[i][t]==0){
                    q.push(t);k++;
                }
            }
        }
        if(k!=n*2) return 0;//如果在其中一个维度不满足关系则说明不满足
    }
    return 1;
}

int main() {
    ios::sync_with_stdio(false);cin.tie(0);
    char ch;
    int m,a,b,c=0;
    while(cin>>n>>m&&(n+m)){
        init();
        //我们添加的边实际上是一种关系,我们把a当成第a个盒子的起点,a+n当成第a个盒子的终点
        while(m--){
            cin>>ch>>a>>b;
            //如果他们是相交的
            if(ch==‘I‘){
                for(int i=0;i<3;i++){
                    mapt[i][a].push_back(b+n);in[i][b+n]++;//a的起点小于b的终点
                    mapt[i][b].push_back(a+n);in[i][a+n]++;//b的起点小于a的终点
                    //说明a b是相交的
                }
            }
            else if(ch==‘X‘) {mapt[0][a+n].push_back(b);in[0][b]++;}//在x轴上a的终点小于b的起点
            else if(ch==‘Y‘) {mapt[1][a+n].push_back(b);in[1][b]++;}//在y轴上a的终点小于b的起点
            else if(ch==‘Z‘) {mapt[2][a+n].push_back(b);in[2][b]++;}//在z轴上a的终点小于b的起点
        }
        cout<<"Case "<<++c<<": ";
        if(!topo()) cout<<"IMPOSSIBLE"<<endl;
        else{
            cout<<"POSSIBLE"<<endl;
            for(int i=1;i<=n;i++){
                cout<<v[0][i];
                for(int j=1;j<3;j++) cout<<" "<<v[j][i];
                for(int j=0;j<3;j++) cout<<" "<<v[j][i+n];
                cout<<endl;
            }
        }
        cout<<endl;
    }
    return 0;
}
时间: 2024-10-13 17:34:43

HDU3231 Box Relations——三维拓扑刨铣的相关文章

HDU3231 Box Relations(拓扑排序)经典

Box Relations Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1042    Accepted Submission(s): 389 Special Judge Problem Description There are n boxes C1, C2, ..., Cn in 3D space. The edges of t

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,那么首先有边&l

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,其他两维同理. 则由大小关系,分别对每一维拓

题单二:图论500

http://wenku.baidu.com/link?url=gETLFsWcgddEDRZ334EJOS7qCTab94qw5cor8Es0LINVaGMSgc9nIV-utRIDh--2UwRLvsvJ5tXFjbdpzbjygEdpGehim1i5BfzYgYWxJmu ==========  以下是最小生成树+并查集=========================[HDU]1213         How Many Tables        基础并查集★1272         小

HDU3231拓扑排序

Box Relations Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1334    Accepted Submission(s): 540Special Judge Problem Description There are n boxes C1, C2, ..., Cn in 3D space. The edges of the

图论五百题!

生死看淡不服就淦,这才是人生! =============================以下是最小生成树+并查集======================================[HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基础并查集★1325&&poj1308 Is It A Tree? 基础并查集★1856 More is better 基础并查集★1102 Constructing Roads 基础最小生成树★1232 畅通工程 基

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

基于HTML5实现的Heatmap热图3D应用

Heatmap热图通过众多数据点信息,汇聚成直观可视化颜色效果,热图已广泛被应用于气象预报.医疗成像.机房温度监控等行业,甚至应用于竞技体育领域的数据分析. 已有众多文章分享了生成Heatmap热图原理,可参考<How to make heat maps>和<How to make heat maps in Flex>,本文将介绍基于HTML5技术的实现方式,主要基于Cavans和WebGL这两种HTML5的2D和3D技术的应用,先上最终例子实现的界面效果和操作视频: 实现Heat

图论精炼500题

忘了从哪转的了... =============================以下是最小生成树+并查集====================================== [HDU] 1213               How Many Tables                    基础并查集★ 1272               小希的迷宫                     基础并查集★ 1325&&poj1308    Is It A Tree?