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=+;
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——三维拓扑排序的更多相关文章
- 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 ...
- 三维拓扑排序好题hdu3231
/* 三维拓扑排序 将每个长方体分解成六个面,xyz三维进行操作 每一维上的的所有长方体的面都应该服从拓扑关系,即能够完成拓扑排序=如果两个长方体的关系时相交,那么其对应的三对面只要交叉即可 如 a1 ...
- 【拓扑排序】【HDU3231】【Box Relations】
题目大意: N个盒子 给你K个以下关系 1.A和B有重叠 2.A在B的左边且不重叠 3.A在B的前边且不重叠 4.A在B的上面且不重叠 显然单独分配X坐标处理2(x1<x2<x1'< ...
- hdu 3231 Box Relations (拓扑排序)
Box Relations Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDU3231拓扑排序
Box Relations Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu3231 (三重拓扑排序) 2009 Asia Wuhan Regional Contest Hosted by Wuhan University
这道题算是我拓扑排序入门的收棺题了,卡了我好几天,期间分别犯了超时,内存溢出,理解WA,细节WA,格式WA…… 题目的意思大概是在一个三维坐标系中,有一大堆矩形,这些矩形的每条棱都与坐标轴平行. 这些 ...
- 【DFS】【拓扑排序】【动态规划】Gym - 100642A - Babs' Box Boutique
给你10个箱子,有长宽高,每个箱子你可以决定哪个面朝上摆.把它们摞在一起,边必须平行,上面的不能突出来,问你最多摆几个箱子. 3^10枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排 ...
- 图——拓扑排序(uva10305)
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
- 拓扑排序 POJ2367Genealogical tree[topo-sort]
---恢复内容开始--- Genealogical tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4875 A ...
随机推荐
- dom写xml
1.引入包 import xml.dom.minidom 2.writexml方法 writexml(writer, indent, addindent, newl, encoding) writer ...
- Struts2初学 Struts.xml详解二
A.使用继承实现设置全局视图 package节点中还可以设置全局的视图,如: <global-results> <result name="e ...
- 安装oracle11g 并且开启APEX 安装
1.Windows下Oracle安装图解----oracle-win-64-11g 详细安装步骤 - souvc - 博客园 oracle 11g 下载网址 一. Oracle 下载 官方下地 ...
- lua工具库penlight--08额外的库(一)
额外的库 在这一节中的库不再被认为是Penlight的核心部分,但在需要时,仍提供专门的功能. 简单的输入的模式 Lua 的字符串模式匹配是非常强大,通常您将不需要传统的正则表达式库.即便如此,有时 ...
- HDFS的实现机制
参考以上这张图,实际上我们客户端访问HDFS里面的内容时,并不需要真实知道内容存在于服务器的内容的真实路径,我们只需要知道一个虚拟路径就可以,比如最上面的hdfs://weekend110:9000/ ...
- 应用于Java中的一个开源的表达式语言(Expression Language)
OGNL(英文全称:Object Graph Navigation Language,中文名:对象导航图语言)是应用于Java中的一个开源的表达式语言(Expression Language),它被集 ...
- 杂文 - 设计MIUI主题 的 MIUI设计师
设计MIUI主题 的 MIUI设计师 本文地址: http://blog.csdn.net/caroline_wendy 时间: 2014.6.10 By Spike. 1. 首先注冊MIUI设计师: ...
- SQL在oracle和SQLserver将查询结果创建为新表的不同之处
------在SQL中,将查询的结果创建为新表是如下这样的 select distinct t1.column1,.t2.column2 into table3 from table1.t1 join ...
- VS编译错误:fatal error C1859:unexpected precompiled header error, simply rerunning the compiler might fix this problem
fatal error C1859:unexpected precompiled header error, simply rerunning the compiler might fix this ...
- 简单配置Nginx 指向本地端口,并开启SSL
简单配置Nginx 指向本地端口,并开启SSL,如果要开启SSL,必须使用域名去申请SSL key,一般是两个文件,一般是要收费的. # 在/etc/nginx/nginx.conf 的文件中有下面一 ...