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=+;
using namespace std;
typedef long long LL;
vector<int>mapt[][N];//3代表三个维度
int in[][N],v[][N],n;
void init(){
for(int i=;i<;i++)
for(int j=;j<=n*;j++){
in[i][j]=v[i][j]=;
mapt[i][j].clear();
} for(int i=;i<;i++)//坐标x,y,z
for(int j=;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<;i++){
int k=;
queue<int>q;
for(int j=;j<=n;j++){
if(in[i][j]==){
q.push(j);
k++;//对于入度为0的起点,作为拓扑起点
}
}
//拓扑套路
while(!q.empty()){
int s=q.front();q.pop();
for(int j=;j<mapt[i][s].size();j++){
int t=mapt[i][s][j];
if(v[i][s]+>v[i][t]) v[i][t]=v[i][s]+;//t是s的后续所以s一定比t大是不合理的,所以我们需要更新t节点的坐标至少为s的坐标+1
if(--in[i][t]==){
q.push(t);k++;
}
}
}
if(k!=n*) return ;//如果在其中一个维度不满足关系则说明不满足
}
return ;
} int main() {
ios::sync_with_stdio(false);cin.tie();
char ch;
int m,a,b,c=;
while(cin>>n>>m&&(n+m)){
init();
//我们添加的边实际上是一种关系,我们把a当成第a个盒子的起点,a+n当成第a个盒子的终点
while(m--){
cin>>ch>>a>>b;
//如果他们是相交的
if(ch=='I'){
for(int i=;i<;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[][a+n].push_back(b);in[][b]++;}//在x轴上a的终点小于b的起点
else if(ch=='Y') {mapt[][a+n].push_back(b);in[][b]++;}//在y轴上a的终点小于b的起点
else if(ch=='Z') {mapt[][a+n].push_back(b);in[][b]++;}//在z轴上a的终点小于b的起点
}
cout<<"Case "<<++c<<": ";
if(!topo()) cout<<"IMPOSSIBLE"<<endl;
else{
cout<<"POSSIBLE"<<endl;
for(int i=;i<=n;i++){
cout<<v[][i];
for(int j=;j<;j++) cout<<" "<<v[j][i];
for(int j=;j<;j++) cout<<" "<<v[j][i+n];
cout<<endl;
}
}
cout<<endl;
}
return ;
}

HDU3231 Box Relations——三维拓扑排序的更多相关文章

  1. 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 ...

  2. 三维拓扑排序好题hdu3231

    /* 三维拓扑排序 将每个长方体分解成六个面,xyz三维进行操作 每一维上的的所有长方体的面都应该服从拓扑关系,即能够完成拓扑排序=如果两个长方体的关系时相交,那么其对应的三对面只要交叉即可 如 a1 ...

  3. 【拓扑排序】【HDU3231】【Box Relations】

    题目大意: N个盒子 给你K个以下关系 1.A和B有重叠 2.A在B的左边且不重叠 3.A在B的前边且不重叠 4.A在B的上面且不重叠 显然单独分配X坐标处理2(x1<x2<x1'< ...

  4. hdu 3231 Box Relations (拓扑排序)

    Box Relations Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  5. HDU3231拓扑排序

    Box Relations Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  6. hdu3231 (三重拓扑排序) 2009 Asia Wuhan Regional Contest Hosted by Wuhan University

    这道题算是我拓扑排序入门的收棺题了,卡了我好几天,期间分别犯了超时,内存溢出,理解WA,细节WA,格式WA…… 题目的意思大概是在一个三维坐标系中,有一大堆矩形,这些矩形的每条棱都与坐标轴平行. 这些 ...

  7. 【DFS】【拓扑排序】【动态规划】Gym - 100642A - Babs' Box Boutique

    给你10个箱子,有长宽高,每个箱子你可以决定哪个面朝上摆.把它们摞在一起,边必须平行,上面的不能突出来,问你最多摆几个箱子. 3^10枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排 ...

  8. 图——拓扑排序(uva10305)

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

  9. 拓扑排序 POJ2367Genealogical tree[topo-sort]

    ---恢复内容开始--- Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4875   A ...

随机推荐

  1. JsonHelper修改4.0

    public class JsonHelper { /// <summary> /// 将对象序列化为JSON格式 /// </summary> /// <param n ...

  2. IOS委托,实现两个UIView相互传值

    转自:http://my.oschina.net/wbei/blog/89325 detegate委托在IOS中是一种随处可见的模式,通俗的说,就是我把想做的某件事委托给其他人去做,就好像Java中的 ...

  3. keepalived virtual_router_id 44

    在同一局或网内如果有多个keepalived 的话 virtuall_router_id 44 (不能相同,但同一对,是一定相同)

  4. PHPStorm 10 激活

    按照这篇东东的说法去做已经不行了~ 可以参考我的另外一篇~ 传送门: http://www.cnblogs.com/gssl/p/5686612.html 楼主的图片看不到,下面是我找到的.分享出来. ...

  5. 【转】logstash配置java环境

    1.bin/logstash,新增 JAVA_CMD=/home/admin/soft/jdk1.8.0_121/bin JAVA_HOME=/home/admin/soft/jdk1.8.0_121 ...

  6. 使用JSTL的xml:parse标签(或者说x:parse)出现异常NoSuchMethodError,找不到doc的setter method

    症状: 如题 <c:import var="hz" url="/xyz/abc.xml" charEncoding="UTF-8"/& ...

  7. 拿与不拿的dfs

    在n个物品中拿k个,使得花费恰好为m. 典型的dfs,对每一个物品,可以选择拿与不拿,然后在判断下一个物品. 失败的dfs: 代码没有保存,只重写一下dfs函数的关键部分: ;i<n;i++) ...

  8. elasticsearch安装与使用(2)-- centos7 安装测试的集群工具elasticsearch head

    elasticsearch-head是elasticsearch(下面称ES)比较普遍使用的可监控.测试等功能的集群管理工具,是由H5编写的单独的网页程序.使用方法网上很多,这里教大家一个超简单安装h ...

  9. [android] AndroidManifest.xml - 【 manifest -> 其他次要配置】

    <uses-sdk> 作用:使应用程序的兼容性更好,指明应用程序需要的最小API,编译API以及最大支持的API.值都是整数 <uses-sdk android:minSdkVers ...

  10. Android Studio 编写 JNI

    之前一直都不知怎么编写JNI,今天刚好学习一下,感谢梦真的指教,以及提供的文档. 参考链接 http://blog.csdn.net/u011168565/article/details/518781 ...