博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-1904 Sorting It All Out 拓扑排序
阅读量:6450 次
发布时间:2019-06-23

本文共 2124 字,大约阅读时间需要 7 分钟。

该题在给定了一些大小的关系的基础上询问是否可以断定N个数的大小关系,其实就是一个拓扑排序题。

注意题义是在给定M组关系中依次处理,一旦根据1-K(1<=K<=N)能够判定是否确定或者冲突则马上退出来。如果一直到最后一组数据还没有这两种情况的话就是不能确定了。

两重for循环建立边的关系,用来完成题目中要求的依次处理,对于每一种情况进行一次拓扑排序,查看是否成环或者确定关系。

  成环的判定方式当每次从所有点中选取度为零的节点不能够再进行的时候,此时选取出来的点还没有N个则说明有环的存在;

  如果所有的点都能够被取出来并且在整个取的过程中每次都有且尽有1个度为零的节点,那么就说明关系可以确定;

  否则为不确定

代码如下:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;int N, M, pos, rec[10000][2], path[30], cnt;struct Edge{ int no, next;}e[10000];struct Node{ int de, next;}p[30];void insert(int x, int y){ ++pos; e[pos].no = y; e[pos].next = p[x].next; p[x].next = pos; ++p[y].de;}void init(){ pos = cnt = 0; for (int i = 1; i <= N; ++i) { p[i].next = 0; // 设置结束标志 p[i].de = 0; }}int fzde(bool &nuc){ int flag = 0, ans = 0; for (int i = 1; i <= N; ++i) { if (p[i].de == 0) { if (!flag) { flag = 1; ans = i; } else { nuc = true; break; } } } return ans;}int topology(){ int node = 0; bool nuc = false; while (node = fzde(nuc)) { --p[node].de; path[++cnt] = node; for (int i = p[node].next; i; i = e[i].next) { --p[e[i].no].de; // 把所有与该节点相连的点的度都减1 } } if (cnt < N) { return 2; } else { return nuc ? 3 : 1; }}int main(){ char r[10]; int x, y, flag; while (scanf("%d %d", &N, &M), N|M) { flag = 0; for (int i = 0; i < M; ++i) { scanf("%s", r); x = r[0]-'A'+1; // NULL 要留出来进行结束判定 y = r[2]-'A'+1; rec[i][0] = x, rec[i][1] = y; } for (int i = 0; i < M && !flag; ++i) { init(); for (int j = 0; j <= i; ++j) { insert(rec[j][0], rec[j][1]); // 每插入一条边进行一次判定,看是否可以得出结论 } switch (topology()) { case 1: { // 1代表根据以上信息足以得到正确的拓扑关系 flag = 1; printf("Sorted sequence determined after %d relations: ", i+1); for (int k = 1; k <= cnt; ++k) { printf("%c", path[k]+'A'-1); } puts("."); break; } case 2: { // 2代表发生了冲突 flag = 1; printf("Inconsistency found after %d relations.\n", i+1); break; } case 3: { break; } } } if (!flag) { puts("Sorted sequence cannot be determined."); } } return 0;}

转载于:https://www.cnblogs.com/Lyush/archive/2012/07/02/2572450.html

你可能感兴趣的文章
App测试中ios和Android的区别
查看>>
java.lang.NullPointerException&com.cb.action.LoginAction.execute(LoginAction.java:48)
查看>>
理解Docker :Docker 网络
查看>>
通过Application存取公共数据比如登录信息等..
查看>>
intellij maven配置与使用
查看>>
SpringMVC文件下载与JSON格式
查看>>
Q:图像太大,在opencv上显示不完全
查看>>
修正锚点跳转位置 避免头部fixed固定部分遮挡
查看>>
Dubbo序列化多个CopyOnWriteArrayList对象变成同一对象的一个大坑!!
查看>>
linux下ping不通的解决方法
查看>>
利用ItextPdf、core-renderer-R8 来生成PDF
查看>>
irc操作小记
查看>>
JAVA 与 PHP 的不同和相同
查看>>
建立Ftp站点
查看>>
NavigationController的使用
查看>>
多线程编程之Windows环境下创建新线程
查看>>
ASP.Net MVC的开发模式
查看>>
groupbox 下的datagridview的列标题字体修改混乱
查看>>
HDU-3092 Least common multiple---数论+分组背包
查看>>
CentOS 7使用systemctl如何补全服务名称
查看>>