九度:1449<拓扑排序><DAG>
2014-03-08 23:11
211 查看
http://ac.jobdu.com/problem.php?pid=1449
使用邻接矩阵实现方便。
使用邻接矩阵实现方便。
// 1449 // 拓扑排序,小号尽量在前 // #include <stdio.h> #define SIZE 500+10 int edge[SIZE][SIZE]; //edge[], 用来存放下一个节点的编号 bool mark[SIZE]; int Q[SIZE]; //存放输出队列 void Init(int n) { for(int i=1; i<=n; i++) { mark[i] = false; for(int j=1; j<= n; j++) { edge[i][j] = -1; } } } void Input(int m) { int p1, p2; while(m-->0) { scanf("%d%d", &p1, &p2); edge[p1][p2] = 1;// x->y } } int main() { #ifdef ONLINE_JUDGE #else freopen("E:\\in.txt", "r", stdin); //freopen("E:\\out.txt", "w", stdout); #endif int n, m; while(scanf("%d%d", &n, &m) != EOF) { if(n == 0 && m ==0) { break; } Init(n); Input(m); /// 核心部分 int num=0; while(num < n) { int i, newP = -1; for(i=1; i<=n; i++) { if( mark[i] == true) { continue; } int j; for(j=1; j<=n; j++) { if(edge[j][i] != -1) { break; } } if(j == n+1) { newP = i; break; } } if(newP != -1) { Q[num++] = newP; mark[newP] = true; int j; for(j=1; j<=n ;j++) { edge[newP][j]=-1; } } newP=-1; } int j; for(j = 0; j<n; j++) { printf("%d", Q[j]); if(j != n-1) { printf(" "); } else { puts(""); } } }//while return 0; }
相关文章推荐
- 九度:1448<拓扑排序>
- <九度 OJ>题目1028:继续畅通工程
- 九度:1026<A+B>
- 九度:1036<枚举>
- 九度:1020<最小长方形>
- 九度:1031<3n+1>
- 九度:1456 <BFS><胜利大逃亡>
- <九度 OJ>题目1012:畅通project
- <九度 OJ>题目1012:畅通工程
- 九度:1021<统计字符>
- 九度:1003<A+B>
- 九度:1444<效率很重要>
- 九度:1034<部分排序><乌镇大富翁>
- 九度:1006<ZOJ问题><规则,规律>
- 九度:1019<图的连通性>
- 九度:1011<A+B for Metrics>
- 九度:1445<并查集>
- 九度:1033<继续3n+1>
- <九度 OJ>题目1061:成绩排序
- 九度:<1002><规则,判断>