hdu 3231 Box Relations 拓扑排序 详细解题报告
来源:互联网 发布:linux c socket编程 编辑:程序博客网 时间:2024/05/22 01:57
题意:
给出n(1 - 1000)个box的m(0 - 100000)个关系,边均平行与坐标轴, 让你构造这样的n个box, 使这些box满足这些关系,关系有以下四种:
1. I i j :表示box i 和 box j 相交
2. X i j : 表示box i 的任意点的x坐标小于box j的任意点的x坐标
3. Y i j : 表示box i 的任意点的y坐标小于box j的任意点的y坐标.
4. Z i j : 表示box i 的任意点的z坐标小于box j的任意点的z坐标
如果能构造出这样的n个box, 输出这n个box的左下角坐标和右上角坐标。否则输出impossible。
分析:
假设用(l, r)表示box的任一维的范围,那么, 对于'X'操作而言, 若要满足box i 的x坐标小于box j的x坐标, 那么,只需要r(i) < l(j), 即box i的x维最大值小于box j的x维最小值。因此,我们只需要知道这n个box的关系后从左往右构造即可, 如何构造呢 ? 假设有3个box, 'X'关系位:box2 < box1, box1 < box3, 那么,根据这个关系我们从小到大排好序后为:l2, r2, l1, r1, l3, r3, 那么我们从1开始依次赋值得到1,2,3,4,5,6, 则,box1:(3,4), box2:(1,2), box3:(5,6), 满足关系, ok, 那么如果给出的关系是:box2 < box1, box2 < box3, 又该如何排序呢?这时候就要用到拓扑排序了, 排序出的结果可能有2种(box2 < box1 < box3 或 box2 < box3 < box1)明显根据两种方案写出来的答案均满足关系, ok, 这下解释清楚了为什么要用拓扑排序。 接下来, 我们要说说‘I'操作, 对于'I'操作, 要使box i 和box j 相交,那么对于任意一维(x or y or z), 均必须满足 l(i) < r(j), l(j) < r(i); 即任意box某维的最小值小于另一个box的该维的最大值,自己在纸上画一下便知道了。
接下来的重点就是如何来拓扑排序了, 这里, 我们把box i的某一维的左端和右端分别用i 和 i+n来表示,因为n最大为1000, 然后因为i肯定是小于i+n的, 所以把i 到 i+n连一条边, 此后,每读入一组关系就根据他们的大小关系连边即可,然后拓扑排序依次赋值即可。OK了, 接下来就是参考代码了:
Code:
#include <cstdio>#include <cstring>#include <queue>#include <vector>using namespace std;const int maxn = 2e3 + 10;vector<int> vec[3][maxn];// 3表示3个维度int in[3][maxn], n, m, kase = 0;void init(){ memset(in, 0, sizeof(in)); for (int i = 0; i < 3; i++) { for (int j = 1; j <= n; j++) {//把i到i+n连边 vec[i][j].clear(); vec[i][j+n].clear(); vec[i][j].push_back(j+n); in[i][j+n] = 1; } }}void read_input(){ char op[3]; int u, v; for (int i = 0; i < m; i++) { scanf("%s%d%d", op, &u, &v); if (op[0] == 'I') { for (int j = 0; j < 3; j++) { vec[j][u].push_back(v+n); vec[j][v].push_back(u+n); in[j][v+n]++; in[j][u+n]++; } } else { vec[op[0]-'X'][u+n].push_back(v); in[op[0]-'X'][v]++; } }}bool topsort(int ans[], int id){ queue<int> Q; for (int i = 1; i <= n; i++) { if (in[id][i] == 0) Q.push(i); } int cur = 0; while (!Q.empty()) { int now = Q.front(); Q.pop(); ans[now] = ++ cur; for (int i = 0; i < vec[id][now].size(); i++) { if (--in[id][vec[id][now][i]] == 0) { Q.push(vec[id][now][i]); } } } if (cur == 2*n) return true; return false;}void solve(){ int flag = 0, ans[3][maxn]; for (int i = 0; i < 3; i++) { if (!topsort(ans[i], i)) flag = 1; } if (flag) printf("Case %d: IMPOSSIBLE\n", ++kase); else { printf("Case %d: POSSIBLE\n", ++kase); for (int i = 1; i <= n; i++) { printf("%d %d %d %d %d %d\n", ans[0][i], ans[1][i], ans[2][i], ans[0][i+n], ans[1][i+n], ans[2][i+n]); } } printf("\n");}int main(){ // freopen("/Users/apple/Desktop/in.txt", "r", stdin); while (scanf("%d%d", &n, &m)) { if (!(n||m)) break; init(); read_input(); solve(); } return 0;}
- hdu 3231 Box Relations 拓扑排序 详细解题报告
- HDU 3231Box Relations 拓扑排序
- HDU 3231 Box Relations(拓扑排序)
- HDU 3231 Box Relations(拓扑排序)
- hdu 3231 Box Relations(拓扑排序)
- 【hdu】3231 Box Relations【拓扑排序三维】
- Hdu 3231 Box Relations(拓扑排序)
- 杭电hdu 3231 box relations 拓扑排序
- Box Relations(拓扑排序)
- HDOJ 3231 Box Relations 拓扑排序
- HDU 3231 Box Relations (三维 拓扑)
- 【拓扑排序】【HDU3231】【Box Relations】
- hdu 3231 Box Relations(模拟+判断长方体的相交和位置+拓扑排序)
- HDU 3231 Box Relations
- hdu 3231 Box Relations
- Hdu3231 step5.2.7 Box Relations(拓扑排序)
- HDU3231 Box Relations(拓扑排序)经典
- hdu 5.2.6 3231 box relations
- 重回极客之路
- 百度编辑器不能上传图片的问题解决方法
- linux下fopen无法打开文件解决办法
- 实用工具
- how to install cocos2d-x 2.2 on mac
- hdu 3231 Box Relations 拓扑排序 详细解题报告
- Cassandra中Gossip具体实现方式
- arcgis发布服务的总结
- NYOJ 168 房间安排
- NYOJ 题目329循环小数(字符串)
- framework not found Metal for architecture armv7/armv7s #66
- KMP和扩展KMP ZOJ 3817 Chinese Knot
- Laravel 入门基础教程
- 减少换页错误、即缺页中断