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. [vt]xenserver磁盘扩容扩不大问题解决

    xenserver将磁盘扩大后,fdisk可以看到容量大了,但是df -h看到磁盘并没有大,解决. 参考 说明:XenServer里面安装的虚拟机,分区的时候采用的是LVM磁盘分区 需求:现在需要扩容 ...

  2. JMeter学习笔记(四)

    1. 断言 断言组件是通过获取服务器响应数据,然后根据断言规则去匹配这些响应数据:匹配到是正常现象,此时我们看不到任何提醒,如果匹配不到,即出现了异常情况,此时JMeter就会断定这个事务失败,那么我 ...

  3. angular学习疑问总结

    服务里返回的数据是不是只能传给控制器,而不能传给指令呢?如果是的话那么指令只能通过配置scope属性来访问控制器里的数据

  4. java的装箱拆箱是什么?

    是什么? 自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱. 为什么 把 ...

  5. JAVA List 分割

    按指定大小,分隔集合,将集合按规定个数分为n个部分 import java.util.ArrayList; import java.util.Collections; import java.util ...

  6. 关于linux下配置python3的virtualenvwrapper

    python版本管理&virtualenv管理 virtualenvwrapper是用来管理virtualenv的扩展包,用着很方便. 注意,在python3中,pip的安装:sudo apt ...

  7. spring cloud outh2

    使用Spring Cloud Security OAuth2搭建授权服务http://www.blogjava.net/paulwong/archive/2016/09/16/431797.html? ...

  8. Ubuntu 15.04 开启远程桌面

    1.安装Xrdp Windows远程桌面使用的是RDP协议,所以ubuntu上就要先安装Xrdp,终端命令行输入安装: sudo apt-get install xrdp vnc4server xba ...

  9. 解决在eclipse中配置Tomcat时,出现"Cannot create a server using the selected type"的错误

    比如说使用tomcat 这是因为你之前创建过一次,比如说tomcat6,你指定的目录是:D:/tomcat-6.0.3 后来因为某种原因你把tomcat删了,然后你又安装到了E:/tomcat-6.0 ...

  10. dp之多重背包hdu1059

    题意:价值为1,2,3,4,5,6. 分别有n[1],n[2],n[3],n[4],n[5],n[6]个.求能否找到满足价值刚好是所有的一半的方案. 思路:简单的多重背包,我建议多重背包都用二进制拆分 ...