两道拓扑排序问题的范例,用拓扑排序解决的实质是一个单向关系问题


POJ1094(ZOJ1060)-Sortng It All Out    

  题意简单,但需要考虑的地方很多,因此很容易将code写繁琐了,会给力求code精简的强迫症患者一个警醒- -

  题意:给出m组逻辑关系式,求n个字母间的排序,分排序成功-排序矛盾-不能确定三种情况输出相应语句

  题解:拓扑排序,访问入度为0的结点,邻接点入度-1,然后继续访问入度为0的结点...直到访问完成为止

     需要注意的地方在于三种情况根据最早确定的情况来输出,例如先排序完成,但后面的关系式表明排序矛盾,此时按照先排序完成得到的序列输出。

    

 //一道考查拓扑排序的经典例题
//POJ1094-ZOJ1060
//Time:0Ms Memory:188K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std; #define MAX 27 struct Letter {
int in; //入度
int v;
vector<int> p;
}letter[MAX]; int n, m;
char seq[MAX]; int topSort(int total)
{
memset(seq, , sizeof(seq));
int tmp[MAX]; //临时入度数组
for (int i = ; i < n; i++)
tmp[i] = letter[i].in; bool correct = true; //是否可行
for (int i = ; i < total;i++)
{
int cur; //当前字母位置
int cnt = ; //入度为0的个数
for (int i = ; i < n; i++)
if (tmp[i] == )
{
cur = i;
cnt++;
}
if (cnt == ) return -;
if (cnt > ) correct = false; //多选时-不可行但须判断是否矛盾
for (int i = ; i < letter[cur].p.size(); i++)
tmp[letter[cur].p[i]]--;
seq[i] = cur + 'A';
tmp[cur]--;
}
return correct;
} int main()
{
//freopen("in.txt", "r", stdin);
while (scanf("%d%d", &n, &m), n && m)
{
int total = ; //输入字母总个数
bool flag = false; //得到结论
memset(letter, , sizeof(letter));
for (int i = ; i <= m; i++)
{
char formula[];
scanf("%s", formula);
if (flag) continue; //已得出结论
int small = formula[] - 'A';
int big = formula[] - 'A';
total += !letter[small].v + !letter[big].v;
letter[small].v = letter[big].v = ;
letter[small].p.push_back(big);
letter[big].in++;
int key = topSort(total);
if (key == -)
{
printf("Inconsistency found after %d relations.\n", i);
flag = true;
}
else if (key == )
{
printf("Sorted sequence determined after %d relations: %s.\n", i, seq);
flag = true;
}
}
if (!flag)
printf("Sorted sequence cannot be determined.\n");
}
return ;
}

POJ2585(ZOJ2193)-Window Pains

  题意:给定一组出现在固定位置的预设窗口,求可否使得这些窗口按照先后次序得到给定样例的显示状态。

  题解:拓扑排序,用覆盖表示先后关系,若最终无环则可以按照一定次序得到样例,如果有环,那么就与覆盖这种单向关系矛盾。

 //拓扑排序-窗口覆盖问题
//单向关系问题
//Time:16Ms Memory:176K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std; #define MAX 4 //预设窗口
struct Map {
int size; //覆盖个数
int num[MAX];
}map[MAX][MAX]; struct Area {
vector<int> cover;
int in; //入度
}area[]; int win[MAX][MAX]; //实际窗口
int mov[][] = { {,}, {,}, {,}, {,} }; void init()
{
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
for (int k = ; k < ; k++)
{
int tx = i + mov[k][];
int ty = j + mov[k][];
map[tx][ty].num[map[tx][ty].size++] = i * + j + ;
}
} //拓扑排序
bool topology()
{
for (int i = ; i < ;i++)
{
int cur = ;
while (++cur < && area[cur].in); //找出入度为0的点
if (cur == ) return false; //存在环-非单向关系
area[cur].in--; vector<int> cover = area[cur].cover;
for (int i = ; i < cover.size(); i++)
area[cover[i]].in--;
}
return true;
} int main()
{
init(); char command[];
while (scanf("%s", command), strcmp(command, "ENDOFINPUT"))
{
memset(area, , sizeof(area));
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
scanf("%d", &win[i][j]);
scanf("%s", command); //Area-Cover
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
for (int k = ; k < map[i][j].size; k++)
{
vector<int> cover = area[win[i][j]].cover;
int num = map[i][j].num[k];
if (num != win[i][j] && cover.end() == find(cover.begin(), cover.end(), num)) //去重
{
area[win[i][j]].cover.push_back(num);
area[num].in++;
}
} if (topology())
printf("THESE WINDOWS ARE CLEAN\n");
else printf("THESE WINDOWS ARE BROKEN\n");
} return ;
}

ACM/ICPC 之 拓扑排序范例(POJ1094-POJ2585)的更多相关文章

  1. ACM/ICPC 之 拓扑排序-反向(POJ3687)

    难点依旧是题意....需要反向构图+去重+看题 POJ3687-Labeling Balls 题意:1-N编号的球,输出满足给定约束的按原编号排列的重量序列,如果有多组答案,则输出编号最小的Ball重 ...

  2. ACM/ICPC 之 拓扑排序+DFS(POJ1128(ZOJ1083)-POJ1270)

    两道经典的同类型拓扑排序+DFS问题,第二题较第一题简单,其中的难点在于字典序输出+建立单向无环图,另外理解题意是最难的难点,没有之一... POJ1128(ZOJ1083)-Frame Stacki ...

  3. ACM: hihicoder #1174 : 拓扑排序·一 STL- queue

    #1174 : 拓扑排序·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 由于今天上课的老师讲的特别无聊,小Hi和小Ho偷偷地聊了起来. 小Ho:小Hi,你这学期有选 ...

  4. ACM/ICPC 之 最短路径-dijkstra范例(ZOJ2750-POJ1135(ZOJ1298))

    最短路经典算法-dijkstra范例(两道),第一道是裸的dijkstra,第二道需要枚举所有边已找到可能的情况. ZOJ2750-Idiomatic Phrases Game 题意:见Code 题解 ...

  5. ACM/ICPC 之 数据结构-邻接表+DP+队列+拓扑排序(TSH OJ-旅行商TSP)

    做这道题感觉异常激动,因为在下第一次接触拓扑排序啊= =,而且看了看解释,猛然发现此题可以用DP优化,然后一次A掉所有样例,整个人激动坏了,哇咔咔咔咔咔咔咔~ 咔咔~哎呀,笑岔了- -|| 旅行商(T ...

  6. nyoj349 poj1094 Sorting It All Out(拓扑排序)

    nyoj349   http://acm.nyist.net/JudgeOnline/problem.php?pid=349poj1094   http://poj.org/problem?id=10 ...

  7. POJ1094 拓扑排序

    问题:POJ1094   本题考查拓扑排序算法   拓扑排序:   1)找到入度为0的点,加入已排序列表末尾: 2)删除该点,更新入度数组.   循环1)2)直到 1. 所有点都被删除,则找到一个拓扑 ...

  8. [ACM] hdu 1285 确定比赛 (拓扑排序)

    确定比赛 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. [poj1094]Sorting It All Out_拓扑排序

    Sorting It All Out poj-1094 题目大意:给出一些字符串之间的大小关系,问能否得到一个唯一的字符串序列,满足权值随下标递增. 注释:最多26个字母,均为大写. 想法:显然,很容 ...

随机推荐

  1. html 等页面防止中文出现乱码的终极解决方案

    网页UTF-8中文乱码问题解决方法 网页UTF-8中文乱码问题解决方法只有经过多方面测试的东西才有质量的保证和说服力,之前一直都是在本地做开发,经过本地测试也是通过的,但一发布到远程服务器上就问题百出 ...

  2. Linux后台执行脚本文件,nohup

    看运维人员执行nohup命令后,把程序放在后台执行,很高大上,就研究了一下,这个命令. nohup命令及其输出文件 nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么 ...

  3. 如何在服务器上搭建git服务器

    参考文章: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770 ...

  4. css+html 总结+归纳

    趁着清明的3天时间,我专门看了xhtml的一套视频,虽然是xhtml但是也隐喻了很多经验,巩固了一下自己的基础,我自己也写了很多大大小小的东西,但是越写我越发觉自己基础的薄弱,果然没错!还是学到了一些 ...

  5. 微信电脑版真的要来了 微信Windows版客户端1.0 Alpha推出

    微信电脑版的搜索量一直很大,但只有网页版,之前也写了微信网页版APP - 网页微信客户端电脑版体验,在键盘上打字的感觉就是快.现在微信Windows版客户端1.0 Alpha推出了,来一睹芳容吧(20 ...

  6. Java基础知识总结(绝对经典)

    写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思路体现出来. 学习新技 ...

  7. webpack 教程 那些事儿05-多页应用

    本篇主要关于如何用webpack构建多页应用 为什么要构建多页应用呢?因为我的项目本来就是多页应用啊至于为什么要用webpack?因为我要用vue啊,嫌gulp 每次打包慢 啊 文章目录 1. 利用v ...

  8. 移动端全屏滑动的小插件,简单,轻便,好用,只有3k swiper,myswiper,page,stage

    https://github.com/donglegend/mySwiper mySwiper 移动端全屏滑动的小插件,简单,轻便,好用,只有3k 下载 直接下载 bower install mySw ...

  9. Effective Java 读书笔记之八 异常

    一.只针对异常的情况才使用异常 1.类具有状态相关的方法时,可采用状态测试方法和可识别的返回值两个策略. 二.对可恢复的情况使用受检异常,对编程错误使用运行时异常 1.期望调用者能够适当恢复的情况,应 ...

  10. Effective Java 读书笔记之四 泛型

    泛型的本质是参数化类型.只对编译器有效. 一.请不要在新代码中使用原生态类型 1.泛型类和接口统称为泛型,有一个对应的原生态类型. 2.原生类型的存在是为了移植兼容性. 3.无限制通配类型和原生态类型 ...