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(青岛现场赛)的部分解题报告,给出了出题率较高的几道题的题解,希望熟悉区域赛的题型,进而对其 ...
随机推荐
- Open multiple Eclipse workspaces on the Mac
This seems to be the supported native method in OS X: cd /Applications/eclipse/ open -n Eclipse.app ...
- NSOJ10050 Newspaper Headline
题意:给你一个<10^4的S串和<10^6的T串,通过将S串重复k次,然后将其中一些多余的字母删掉可以获得T串,问k最小是多少,没有的话输出1. 思路:对于每个T串里的字母,我们从左到右扫 ...
- POJ 1775
#include <iostream> using namespace std; ,,,,,,,,,}; bool boo; void DFS(int time,int sum); int ...
- 02 - Tomcat配置
Tomcat配置 本文内容 介绍 Windows UNIX daemon 1.介绍 首选看Tomcat目录下的RUNNING.TXT 2.Windows平台下 可以选择下载windows instal ...
- 深入理解JVM--类的执行机制
在完成将class文件信息加载到JVM并产生class对象之后,就可以执行Class对象的静态方法或者实例方法对对象进行调用了.JVM在源代码编译阶段将源代码编译为字节码文件,字节码是一种中间代码的方 ...
- static int和static final int的区别
1.static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是: 对于静态变量在内 ...
- SULogger:iOS日志可视化工具
前言 debug对于咋们程序员来说家常便饭,但有时候我们会遇到一种情况:开发某个功能时,需要在某个特定场景下进行调试,而这个场景并没有MacBook来进行连接debug,偏偏我们需要获得调试时的一些信 ...
- [Unity菜鸟] Time
1. Time.deltaTime 增量时间 以秒计算,完成最后一帧的时间(秒)(只读) 帧数所用的时间不是你能控制的.每一帧都不一样,游戏一般都是每秒60帧,也就是updata方法调用60次(假如你 ...
- JavaWeb项目开发案例精粹-第2章投票系统-005实体层
1. package com.sanqing.bean; /** * * 投票选项类 * */ public class VoteOption { private int voteOptionID; ...
- TCoolMemo
我们先起个名字叫做TCoolMemo.以上篇已经讲了很多组件的技术,这里就只说出几个重点.其余不多说了. 首先,该Memo从CustomMemo继承,它有这样外观:属于平面的,边框是可以设置颜色的线, ...