这道题算是我拓扑排序入门的收棺题了,卡了我好几天,期间分别犯了超时,内存溢出,理解WA,细节WA,格式WA……

题目的意思大概是在一个三维坐标系中,有一大堆矩形,这些矩形的每条棱都与坐标轴平行。

这些矩形有4种情况——

1. 有重合部分(I a b) 表示a与b重合;

2. a的x坐标大于b的x坐标(X a b),表示a的最大的x坐标大于b的最小的x坐标;

3. (Y a b)y坐标,同上;

4. (Z a b)z坐标,同上;

也就是说,我们可以把每个矩形ai按照三个方向分解,分别为——平行于xoy平面的ai的上平面a01和ai的下平面a02,平行于xoz平面的ai的左平面a11和ai的右平面a12,平行于yoz平面的ai的前平面a21和ai的后平面a22。

假设有(I a b),那么表示a01 < b02, a02 < b01; a11 < b12, a12 < b11; a21 < b22, a22 < b21;

假设有(X a b),那么表示a02 < b01;

假设有(Y a b),那么表示a12 < b11;

假设有(Y a b),那么表示a22 < b21;

同时,每个矩形自身有特点:a01 < a02, a11<a12, a21 < a22;

然后我们就分别获得了关于所有矩形的三个平面上的拓扑关系,然后分别对三个平面进行拓扑排序,如果有一组不满足,那么就输出不可能。

 #include <cstdio>
#include <cstring>
#include <queue>
using namespace std; const int N = ;
const int M = ; struct Node
{
int val[];
int ds[];
}s[N<<]; //保存每个平面的坐标值和深度(前面有几个平面) struct node
{
int to;
int next;
}eage[][M<<]; //每组平面之间的关系 int n, m;
int a, b;
char ch[];
int head[][M<<];
int tm = ;
int k[]; bool tsort(int x)
{
queue<int> que; int sum = ;
for(int i = ; i <= *n+; i++)
{
if(s[i].ds[x] == )
{
que.push(i);
s[i].val[x] = ;
}
}
while(!que.empty())
{
int p = que.front();
que.pop();
s[p].ds[x]--;
sum++; for(int i = head[x][p]; i != -; i = eage[x][i].next)
{
int v = eage[x][i].to;
s[v].ds[x]--;
if(s[v].ds[x] == )
{
que.push(v);
s[v].val[x] = s[p].val[x]+;
}
}
}
if(sum == *n) return ;
return ;
} void get(int x, int a, int b)
{
eage[x][k[x]].to = b;
eage[x][k[x]].next = head[x][a];
head[x][a] = k[x]++;
s[b].ds[x]++;
} int main()
{
//freopen("test.txt", "r", stdin);
while(~scanf("%d%d", &n, &m) && (n+m))
{
memset(k, , sizeof(k));
memset(head, -, sizeof(head));
memset(s, , sizeof(s)); while(m--)
{
scanf("%s%d%d", ch, &a, &b);
if(ch[] == 'I')
{
for(int i = ; i < ; i++)
{
get(i, *a, *b+);
get(i, *b, *a+);
}
}
else get(ch[]-'X', *a+, *b);
}
for(int i = ; i <= n; i++)
for(int j = ; j < ; j++) get(j, *i, *i+); printf("Case %d: ", tm++);
bool p = ;
for(int i = ; i < ; i++)
{
if(!tsort(i))
{
printf("IMPOSSIBLE\n\n");
p = ;
break;
} }
if(p) continue; printf("POSSIBLE\n");
for(int i = ; i <= *n+; i++)
{
for(int j = ; j < ; j++)
{
printf("%d", s[i].val[j]);
if(i% == || j < ) printf(" ");
else printf("\n");
}
}
printf("\n");
}
return ;
}

代码姿势和大神比还是很挫……需要继续努力!

hdu3231 (三重拓扑排序) 2009 Asia Wuhan Regional Contest Hosted by Wuhan University的更多相关文章

  1. HDU 3269 P2P File Sharing System(模拟)(2009 Asia Ningbo Regional Contest)

    Problem Description Peer-to-peer(P2P) computing technology has been widely used on the Internet to e ...

  2. hdu 3123 GCC (2009 Asia Wuhan Regional Contest Online)

    GCC Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Subm ...

  3. hdu oj 3127 WHUgirls(2009 Asia Wuhan Regional Contest Online)

    WHUgirls Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total ...

  4. 2018 ACM-ICPC Asia Beijing Regional Contest (部分题解)

    摘要 本文主要给出了2018 ACM-ICPC Asia Beijing Regional Contest的部分题解,意即熟悉区域赛题型,保持比赛感觉. Jin Yong’s Wukong Ranki ...

  5. ACM-ICPC Asia Beijing Regional Contest 2018 Reproduction hihocoder1870~1879

    ACM-ICPC Asia Beijing Regional Contest 2018 Reproduction hihocoder1870~1879 A 签到,dfs 或者 floyd 都行. #i ...

  6. zoj 3659 Conquer a New Region The 2012 ACM-ICPC Asia Changchun Regional Contest

    Conquer a New Region Time Limit: 5 Seconds      Memory Limit: 32768 KB The wheel of the history roll ...

  7. 2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)

    2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred) easy: ACE ...

  8. 2014-2015 ACM-ICPC, Asia Xian Regional Contest(部分题解)

    摘要 本文主要给出了2014-2015 ACM-ICPC, Asia Xian Regional Contest的部分题解,说明了每题的题意.解题思路和代码实现,意即熟悉区域赛比赛题型. Built ...

  9. The 2018 ACM-ICPC Asia Qingdao Regional Contest(部分题解)

    摘要: 本文是The 2018 ACM-ICPC Asia Qingdao Regional Contest(青岛现场赛)的部分解题报告,给出了出题率较高的几道题的题解,希望熟悉区域赛的题型,进而对其 ...

随机推荐

  1. QTP之web常用对象

    web对象是我做自动化以来最早学习,最早接触的.对现在而言也是最熟悉不过的了,但是为了以后更稳健的前进,对基础的东西搞扎实,相信以后的路会顺畅许多,下边简单汇总下web的常用几类对象: Browser ...

  2. lintcode 中等题:Simplify Path 简化路径

    题目 简化路径 给定一个文档(Unix-style)的完全路径,请进行路径简化. 样例 "/home/", => "/home" "/a/./b ...

  3. Java学习笔记之:java运算符

    一.介绍 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算 ...

  4. Qt网络通信骨架解析,QtClient QtServer QtSerialPort

    http://blog.csdn.net/Dr_Abel/article/details/52469134#t18

  5. 转:Servlet的url匹配以及url-pattern详解

    Servlet是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜.估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,servlet中的u ...

  6. Java—反射

    通过程序化的方式间接对Class的对象实例操作,Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数.属性和方法 ...

  7. 计算机视觉和人工智能的状态:我们已经走得很远了 The state of Computer Vision and AI: we are really, really far away.

    The picture above is funny. But for me it is also one of those examples that make me sad about the o ...

  8. [HDOJ2818]Building Block(带权并查集,路径压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2818 题意:有N个块,每次有两个操作: M x y表示把x所在的那一堆全部移到y所在的那一堆的下方. ...

  9. devDependencies和dependencies的区别

    我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,比如: --save-dev --save 在 package.json 文件里面 ...

  10. CSS在不同浏览器兼容问题,margin偏移/offset溢出等

    margin在垂直取值时取最大值 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...