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 ...
随机推荐
- JsonHelper修改4.0
public class JsonHelper { /// <summary> /// 将对象序列化为JSON格式 /// </summary> /// <param n ...
- IOS委托,实现两个UIView相互传值
转自:http://my.oschina.net/wbei/blog/89325 detegate委托在IOS中是一种随处可见的模式,通俗的说,就是我把想做的某件事委托给其他人去做,就好像Java中的 ...
- keepalived virtual_router_id 44
在同一局或网内如果有多个keepalived 的话 virtuall_router_id 44 (不能相同,但同一对,是一定相同)
- PHPStorm 10 激活
按照这篇东东的说法去做已经不行了~ 可以参考我的另外一篇~ 传送门: http://www.cnblogs.com/gssl/p/5686612.html 楼主的图片看不到,下面是我找到的.分享出来. ...
- 【转】logstash配置java环境
1.bin/logstash,新增 JAVA_CMD=/home/admin/soft/jdk1.8.0_121/bin JAVA_HOME=/home/admin/soft/jdk1.8.0_121 ...
- 使用JSTL的xml:parse标签(或者说x:parse)出现异常NoSuchMethodError,找不到doc的setter method
症状: 如题 <c:import var="hz" url="/xyz/abc.xml" charEncoding="UTF-8"/& ...
- 拿与不拿的dfs
在n个物品中拿k个,使得花费恰好为m. 典型的dfs,对每一个物品,可以选择拿与不拿,然后在判断下一个物品. 失败的dfs: 代码没有保存,只重写一下dfs函数的关键部分: ;i<n;i++) ...
- elasticsearch安装与使用(2)-- centos7 安装测试的集群工具elasticsearch head
elasticsearch-head是elasticsearch(下面称ES)比较普遍使用的可监控.测试等功能的集群管理工具,是由H5编写的单独的网页程序.使用方法网上很多,这里教大家一个超简单安装h ...
- [android] AndroidManifest.xml - 【 manifest -> 其他次要配置】
<uses-sdk> 作用:使应用程序的兼容性更好,指明应用程序需要的最小API,编译API以及最大支持的API.值都是整数 <uses-sdk android:minSdkVers ...
- Android Studio 编写 JNI
之前一直都不知怎么编写JNI,今天刚好学习一下,感谢梦真的指教,以及提供的文档. 参考链接 http://blog.csdn.net/u011168565/article/details/518781 ...