pku 1094(拓扑排序,多次拓扑)
/*Name: 拓扑排序,多次拓扑Copyright: Author: Try86Date: 16/04/12 21:36Description: */#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream>using namespace std;const int N = 27;bool ch[N]; char ans[N]; //存拓扑序 int inDeg[N]; //入度数 struct node {int v;node *next;node(int vv, node *p) {v = vv;next = p;} };struct graph {node *link; }G[N];void init(int n) {for (int i=0; i<n; ++i) G[i].link = NULL;return ; } void buildG(int u, int v) {node *p = new node(v, G[u].link);G[u].link = p;return ; }int topoSort(int n, int s) {int temp[27], cs, j, k = 0;for (int i=0; i<n; ++i) temp[i] = inDeg[i];//当前各点入度数 bool flag = true;while (s--) {cs = 0;//统计入度为0的顶点个数 for (int i=0; i<n; ++i) {if (temp[i] == 0) j = i, ++cs;}if (cs >= 1) {if (cs > 1) flag = false;//入度为0的顶点个数大于1,拓扑序有多个,不能比较拓扑序的关系 for (node *p=G[j].link; p; p=p->next) --temp[p->v];ans[k++] = j + 'A';temp[j] = -1;ans[k] = '\0';}else return -1;//入度为0的个数为0,存在回路,不能形成拓扑序 }if (flag) return k;return 0; }void del(node *p) {if (!p) return ;del(p->next);delete p;return ; }int main() {int n, m;char str[4];while (scanf("%d%d", &n, &m) && n+m) {init(n);memset(ch, false, sizeof(ch));memset(inDeg, 0, sizeof(inDeg));int junge, counts, k;junge = counts = 0;for (int i=0; i<m; ++i) {scanf ("%s", str);if (junge != -1) {//junge!=-1,则当前输入下,不存在回路int u = str[0] - 'A';int v = str[2] - 'A';buildG(u, v);++inDeg[v];if (!ch[u]) ++counts, ch[u] = true;if (!ch[v]) ++counts, ch[v] = true;}if (junge == 0) {//junge==0,则当前输入下,不存在回路,也不存在孤立点,图连通,需继续拓扑 int t = topoSort(n, counts);if (t == -1) junge = -1, k = i + 1;else if (t == n) junge = 1, k = i + 1;}}if (junge == -1) printf ("Inconsistency found after %d relations.\n", k);else if (junge == 0) printf ("Sorted sequence cannot be determined.\n");else printf ("Sorted sequence determined after %d relations: %s.\n", k, ans); for (int i=0; i<n; ++i) del(G[i].link);}return 0; }
转载于:https://www.cnblogs.com/try86/archive/2012/04/16/2452754.html
pku 1094(拓扑排序,多次拓扑)相关推荐
- 拓扑排序及逆拓扑排序
拓扑排序其实就是对有向无环图的顶点的一种排序,每个顶点出现且只出现一次. 对一个AOV网进行拓扑排序的方法: 1.从AOV网中选择一个入度为0的顶点并输出: 2.从网中删除该顶点和所有以它为起点的有向 ...
- python 拓扑排序 dfs bfs_拓扑排序的DFS和BFS
博主以前有一个疑问,DFS和BFS各自的适用范围是?我想你今天看了这篇文章之后会有一个判断! BFS 数据结构与算法分析:c语言描述(p217) 已经存在一个Indgree入度数组(indgree[v ...
- 拓扑排序与逆拓扑排序
- aov建立Java模拟,数据结构之---C语言实现拓扑排序AOV图
//有向图的拓扑排序 //杨鑫 #include #include #include #define MAX_NAME 3 #define MAX_VERTEX_NUM 20 typedef int ...
- 拓扑排序之变量序列代码
/* Name: Copyright: Author: Date: 17-11-14 21:02 Description: 拓扑排序之变量序列 如果有n个变量(1<=n<=26,变 ...
- hdu 4109 Instrction Arrangement 拓扑排序 关键路径
这个算是关键路径的模版题目了,解这个题目之前,首先说下关键路径的含义,传送门(度娘),个人的见解是,关键路径就是木桶的短板问题,比如有一群人约好去某个地方,大家从同一个地方同一时间开始出发,有些人选择 ...
- 【算法】图(一)拓扑排序的实现 图的邻接表算法 判断是否图G中存在环
文章目录 用list来表示图,判断是否存在环 邻接表实现拓扑排序 用DFS(邻接矩阵) 来实现拓扑排序. 判断无向图顶点是否全部连通 判断图G中从顶点u到v是否存在简单路径 输出图G中从顶点u到v的所 ...
- 数据结构-----图的拓扑排序和关键路径算法
部分图片取自:http://www.cnblogs.com/navorse/articles/1893863.html 在介绍拓扑排序和关键路径之前,先引入AOE网络的概念: 该图为一个AOE网,顶点 ...
- 从LeetCode 210. Course Schedule II 了解拓扑排序
问题简述 给定n节课,每节课按0~n-1编号. 在修某些课的时候需要有其它课的基础,必须先上先修课.现在用pair的形式来表示要先修的课,比如 [ [0,1], [1,2] ] 就表示在修课程1之前必 ...
- 拓扑排序和关键路径课程设计
目录 1. 设计任务书... 3 1.1设计任务... 3 1.2程序功能... 3 1.3运行环境... 3 2. 本组课题... 3 2.1课题... 3 2.2本人任务... 3 3 ...
最新文章
- python基础教程第三版和第二版选哪个-python基础教程 2版和3版哪个适合新手?!...
- python getmenu不到菜单句柄,从弹出菜单win32 api Python中选择项目
- 汇编语言(二十三)之求一个数的补数
- 手机web网页制作的认识(有关meta标签)
- JavaScript-概述
- U811.1接口EAI系列之二-BOM构成-委外BOM构成--VB语言
- Quartus17下使用Modelsim10进行仿真
- HDU 5773 The All-purpose Zero(O(nlgn)求LIS)
- java post上传进度,OkHttp实现文件上传进度
- 计算机 术语库 excel,Trados直接用Excel做术语库
- java复习即基础知识点 思维导图
- 洛谷P1447 [NOI2010]能量采集(容斥)
- 问题记录:net::ERR_CERT_DATE_INVALID
- 【python实现网络爬虫21】天眼查企业数据获取
- dell t320 raid linux,Dell T320服务器阵列卡驱动下载
- golang 使用ssl连接smtp发送邮件
- panda是删除行_pandas删除包含指定内容的行
- Tcp为什么是4次挥手呢?为什么是3次握手,不能是3次挥手呢?
- 三五族异质结的自发极化、压电极化及2DEG
- Python小例子——BMR计算器