这道题算是我拓扑排序入门的收棺题了,卡了我好几天,期间分别犯了超时,内存溢出,理解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. LINQ——语言级集成查询入门指南(1)

    本文主要是对语言级集成查询或简称为LINQ做一个介绍,包括LINQ是什么,不是什么,并对它在语言特性方面做一个简短的回顾,然后举一些使用LINQ的实际例子进行说明. 语言级集成查询是什么? 在我过去写 ...

  2. Project Euler 83:Path sum: four ways 路径和:4个方向

    Path sum: four ways NOTE: This problem is a significantly more challenging version of Problem 81. In ...

  3. iOS:自定义工具栏、导航栏、标签栏

    工具栏为UIToolBar,导航栏UINavigationBar,标签栏UITabBar.它们的样式基本上时差不多的,唯一的一点区别就是,工具栏一般需要自己去创建,然后添加到视图中,而导航栏和标签栏不 ...

  4. ServletContentLIstener接口演示ServletContext的启动和初始化

    ServletContextListener接口中包含两个方法,一个是contextInitialized()方法, 用来监听ServletContext的启动和初始化:一个是contextDestr ...

  5. Android ListView高度自适应和ScrollView冲突解决

    在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据.起初我以为是样式的问题,一直在对XML文件的样式进行尝试性设置,但始终得不到想要的效果.后来在网上查了查,S ...

  6. 转Java 回调函数的理解

    所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数.例如Win32下的窗口过程函数就是一个典型的回调函数.一般说来,C ...

  7. java.lang.NumberFormatException: For input string:"filesId"

    做项目时候,页面获取出现了这个问题.找了好久一直以为是我字段或者是数据库字段问题导致引起的. 最后才发现是 struts2中jsp我写错了一个参数,一直导致报错.后来改了就好了. 当大家遇到这个问题的 ...

  8. android源码编译1

    一.环境说明: 1.liunx系统:Ubuntu12.04 2.jdk:sun-java6-jdk 3.g++4.5 gcc4.5 二.android源码的目录结构 |-- Makefile |-- ...

  9. 加密解密(9)Diffie-Hellman密钥交换协议

    过程如下 : 1,小李把KeyX经过加密变化,生成MsgA传给老王. 2,老王得到MsgA,保存在本地. 3,老王把KeyY经过加密变化,生成MsgB传给小李, 4,小李得到MsgB保存在本地, 5, ...

  10. yeoman开始项目

    使用 yeoman 构建项目之前,你需要安装这两个环境:node,ruby. 为什么需要使用node?因为我们需要使用grunt自动化工具,而grunt工具则是依赖node. 为什么需要使用ruby? ...