hdu3231 (三重拓扑排序) 2009 Asia Wuhan Regional Contest Hosted by Wuhan University
这道题算是我拓扑排序入门的收棺题了,卡了我好几天,期间分别犯了超时,内存溢出,理解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的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- 2018 ACM-ICPC Asia Beijing Regional Contest (部分题解)
摘要 本文主要给出了2018 ACM-ICPC Asia Beijing Regional Contest的部分题解,意即熟悉区域赛题型,保持比赛感觉. Jin Yong’s Wukong Ranki ...
- ACM-ICPC Asia Beijing Regional Contest 2018 Reproduction hihocoder1870~1879
ACM-ICPC Asia Beijing Regional Contest 2018 Reproduction hihocoder1870~1879 A 签到,dfs 或者 floyd 都行. #i ...
- 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 ...
- 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 ...
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest(部分题解)
摘要 本文主要给出了2014-2015 ACM-ICPC, Asia Xian Regional Contest的部分题解,说明了每题的题意.解题思路和代码实现,意即熟悉区域赛比赛题型. Built ...
- The 2018 ACM-ICPC Asia Qingdao Regional Contest(部分题解)
摘要: 本文是The 2018 ACM-ICPC Asia Qingdao Regional Contest(青岛现场赛)的部分解题报告,给出了出题率较高的几道题的题解,希望熟悉区域赛的题型,进而对其 ...
随机推荐
- LINQ——语言级集成查询入门指南(1)
本文主要是对语言级集成查询或简称为LINQ做一个介绍,包括LINQ是什么,不是什么,并对它在语言特性方面做一个简短的回顾,然后举一些使用LINQ的实际例子进行说明. 语言级集成查询是什么? 在我过去写 ...
- 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 ...
- iOS:自定义工具栏、导航栏、标签栏
工具栏为UIToolBar,导航栏UINavigationBar,标签栏UITabBar.它们的样式基本上时差不多的,唯一的一点区别就是,工具栏一般需要自己去创建,然后添加到视图中,而导航栏和标签栏不 ...
- ServletContentLIstener接口演示ServletContext的启动和初始化
ServletContextListener接口中包含两个方法,一个是contextInitialized()方法, 用来监听ServletContext的启动和初始化:一个是contextDestr ...
- Android ListView高度自适应和ScrollView冲突解决
在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据.起初我以为是样式的问题,一直在对XML文件的样式进行尝试性设置,但始终得不到想要的效果.后来在网上查了查,S ...
- 转Java 回调函数的理解
所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数.例如Win32下的窗口过程函数就是一个典型的回调函数.一般说来,C ...
- java.lang.NumberFormatException: For input string:"filesId"
做项目时候,页面获取出现了这个问题.找了好久一直以为是我字段或者是数据库字段问题导致引起的. 最后才发现是 struts2中jsp我写错了一个参数,一直导致报错.后来改了就好了. 当大家遇到这个问题的 ...
- android源码编译1
一.环境说明: 1.liunx系统:Ubuntu12.04 2.jdk:sun-java6-jdk 3.g++4.5 gcc4.5 二.android源码的目录结构 |-- Makefile |-- ...
- 加密解密(9)Diffie-Hellman密钥交换协议
过程如下 : 1,小李把KeyX经过加密变化,生成MsgA传给老王. 2,老王得到MsgA,保存在本地. 3,老王把KeyY经过加密变化,生成MsgB传给小李, 4,小李得到MsgB保存在本地, 5, ...
- yeoman开始项目
使用 yeoman 构建项目之前,你需要安装这两个环境:node,ruby. 为什么需要使用node?因为我们需要使用grunt自动化工具,而grunt工具则是依赖node. 为什么需要使用ruby? ...