递归练习 uva 10305
2016-03-10 20:39
375 查看
//题意:输入n和m,以及m个二元组(i,j),求1~n的一个排列使得对于每个(i,j),i在j的前面(拓扑排序) #include<cstdio> #include<cstring> const int maxn = 1000; int n, m, G[maxn][maxn], c[maxn], topo[maxn], t; bool dfs(int u,int deep){ // for(int i=0;i<deep ;i++){ //debug // printf(" "); // } // printf("%d %d\n",u,deep); c[u] = -1; for(int v = 0; v < n; v++) if(G[u][v]) { if(c[v]<0) return false; else if(!c[v]) dfs(v,deep+1); //else if(!c[v] && !dfs(v) ) return false; } c[u] = 1; //千万不能省,可能正确的数据输出no。因为dfs过程中需要区分是环(dfs还在栈帧中,尚未返回) //还是只是以前访问过,并且递归访问过他的所有子孙 topo[--t]=u; return true; } bool toposort(){ t = n; memset(c, 0, sizeof(c)); for(int u = 0; u < n; u++) if(!c[u]) if(!dfs(u,0)) return false; return true; } int main() { while(scanf("%d%d", &n, &m) == 2 && n) { memset(G, 0, sizeof(G)); for(int i = 0; i < m; i++) { int u, v; scanf("%d%d", &u, &v); u--; v--; G[u][v] = 1; } if(toposort()) { for(int i = 0; i < n-1; i++) printf("%d ", topo[i]+1); printf("%d\n", topo[n-1]+1); } else printf("No\n"); //题目没说无解输出什么,应该是保证有解吧 } }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi