例题 6-15 UVA 10305 Ordering Tasks 给任务排序
2016-02-22 18:46
489 查看
简单记录下 书中的方法:
建立一个c数组表示访问的状态,-1为正在访问,1表示访问完毕,0表示未访问。
G[u][v]表示u < v在输入中出现过。
然后遍历U, 对u进行dfs,dfs的方式是从1到n在来一遍,依次进行。
之所以数组倒着写,是因为输入的肯定是dfs最深的,最深的也是最大的,要放在面!
建立一个c数组表示访问的状态,-1为正在访问,1表示访问完毕,0表示未访问。
G[u][v]表示u < v在输入中出现过。
然后遍历U, 对u进行dfs,dfs的方式是从1到n在来一遍,依次进行。
之所以数组倒着写,是因为输入的肯定是dfs最深的,最深的也是最大的,要放在面!
#include<cstdio> #include<cstring> const int maxn = 100 + 10; int c[maxn],G[maxn][maxn],ans[maxn]; int n,m,t; bool dfs(int u){ c[u] = -1;// visiting for (int i = 1; i <= n; ++i){ if (G[u][i]){ if (c[i] == -1)return false; else if (!c[i] && !dfs(i))return false; } } c[u] = 1;ans[--t]=u; return true; } bool solve(){ t = n; memset(c,0,sizeof(c)); for (int i = 1; i <= n; ++i)if (!c[i]) if (!dfs(i))return false; return true; } int main() { while(scanf("%d%d",&n,&m) == 2 && (n || m)){ int a,b; memset(G,0,sizeof(G)); for (int i = 1; i <= m; ++i){ scanf("%d%d",&a,&b); G[a][b] = 1; } solve(); for (int i = 0;i < n; ++i)printf("%s%d",i?" ":"",ans[i]); printf("\n"); } return 0; }
相关文章推荐
- ZOJ 3204 Connect them(最小生成树)
- spring 2.5 AOP之代理类基础理解
- AngularJS表达式中的HTML内容
- leetcode single numbers I II III
- 高德地图定位源码
- java平台脚本+java编译器API
- 华为机试题:将十六进制字符串形式内容转为内存值形式(java)
- PhpStorm 配置在浏览器中打开文件
- Android学习架构图
- wamp开启rewrite_module重写功能启用.htaccess文件
- 【python】 字符串替换+正则
- The RAII Programming Idiom
- 打包时的配置
- Java笔记19:Java匿名内部类
- android 自定义RadioButton样式
- ZOJ 3203 Light Bulb(数学)
- OpenGL Common Mistakes
- 26. Remove Duplicates from Sorted Array
- java(16)--servlet+jsp+四大域+javabean+开发模式
- 第十章 Redis持久化--RDB+AOF