博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 10305 - Ordering Tasks ( 拓扑排序, DFS, DAG )
阅读量:5260 次
发布时间:2019-06-14

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

题意

假设有n个变量,还有m个二元组(u, v),分别表示变量u小于v。那么,所有变量从小大排列起来应该是什么样子的呢?例如,有4个变量a, b, c, d,若已知a < b,c < b,d < c,则这4个变量的排序可能是a < d < c < b。尽管还有其他可能(如d < a < c < b),你只需找出其中一个即可

思路

无环图DAG才存在拓扑排序, 用mrk[]标记三种状态: -1(正在访问), 0(未访问), 1(访问过且已返回)

如果递归dfs遇到-1说明是有环图, 则不存在拓扑排序

AC代码

#include 
#include
#include
using namespace std;const int maxn = 100 + 50;int dag[maxn][maxn];int t[maxn], mrk[maxn];int n, m, tp;bool dfs( int x ){ mrk[x] = -1; for( int i = 1; i <= n; i++ ){ if( dag[x][i] ){ if( mrk[i] == -1 ) return false; else if( !mrk[i] && !dfs(i) ) return false; } } mrk[x] = 1; t[--tp] = x; return true;}bool topo(){ tp = n; for( int i = 1; i <= n; i++ ) if( !mrk[i] && !dfs(i) ) return false; return true;}int main(){ int a, b; while( scanf("%d%d",&n, &m) == 2 && n ){ memset(dag, 0, sizeof(dag)); memset(mrk, 0, sizeof(mrk)); while( m-- ){ scanf("%d%d",&a,&b); dag[a][b] = 1; } topo(); for( int i = 0; i < n; i++ ){ if( i != 0 ) putchar(' '); printf("%d",t[i]); } putchar('\n'); } return 0;}

转载于:https://www.cnblogs.com/JinxiSui/p/9740595.html

你可能感兴趣的文章
Servlet 远程服务IO流传输数据
查看>>
Python学习(七)面向对象 ——继承和多态
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
阴影:box_shadow
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
SQL重复记录查询(转载)
查看>>
python的os模块命令
查看>>
TreeView控件
查看>>
Freemarker常用技巧(一)
查看>>
LintCode Python 入门级题目 删除链表元素、整数列表排序
查看>>
java高级知识
查看>>
实时获取网络时间 并转换为北京时间的函数
查看>>
Java 缓存池(使用Map实现)
查看>>
第9周读书笔记——《黑客与画家》
查看>>
Java基础——6
查看>>
SQL join 练习
查看>>
selenium2基本控件介绍及其代码
查看>>
团队作业4——第一次项目冲刺(Alpha版本)第六天and第七天
查看>>
如何前后端分离?
查看>>