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 ...
随机推荐
- Struts2对AJAX的支持
一.简介 struts2确实一个非常棒的MVC框架.这里部分记述一下struts2对AJAX的支持.实现AJAX有两种方式,一种是使用原生的javascript代码实现,一种是使用第三方 ...
- makefile之wildcard函数
$(wildcard PATTERN) 函数功能: 获取匹配 PATTERN 的所有对象 返回值: 使用空格分割的匹配对象列表 1. 示例1
- 0073 javacTask: 源发行版 1.8 需要目标发行版 1.8
今天在编译执行下面这段代码的时候,编译报错:javacTask: 源发行版 1.8 需要目标发行版 1.8 public class Test { public static void main(St ...
- c# 程序调试出现“未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。”
简单的程序代码如下:DataSet ds=new DataSet();try{ string strCon = @"Provider=Microsoft.Jet.OLEDB.4.0;Data ...
- 树形dp - BNU 39572 Usoperanto
Usoperanto Problem's Link Mean: 给定n个单词,每个单词可以作为形容词来修饰其他单词. 如果当前单词Wi修饰Wj,那么这个修饰的代价是:Wi~Wj之间的单词的总长度. 你 ...
- Deep learning for Human Strategic Behaviour
没看,但是论文UI和视频做的很好. 论文地址:https://papers.nips.cc/paper/6509-deep-learning-for-predicting-human-strategi ...
- 【转】【Linux】sed命令详解
sed命令详解 sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令 ...
- web 汇率
http://www.cnblogs.com/beimeng/p/3789940.html 网站虽小,五脏俱全(干货) 前言 最近一个朋友让帮忙做一个汇率换算的网站,用业余时间,到最后总算是实现了 ...
- PyQt5资料
http://bbs.fishc.com/thread-59816-1-1.html https://pypi.python.org/pypi/PyQt5/ http://www.thehackeru ...
- Mac 文件读写权限问题 OSError: Operation not permitted
Mac在OS X 10.11以后加入了Rootless功能,主要是限制了root权限,阻止用户对部分路径下的目录进行更改.受到限制的有以下目录: /System /bin /sbin /usr (ex ...