九度:1449<拓扑排序><DAG>

来源:互联网 发布:中国的中产阶级 知乎 编辑:程序博客网 时间:2024/05/23 18:50

http://ac.jobdu.com/problem.php?pid=1449


使用邻接矩阵实现方便。


// 1449// 拓扑排序,小号尽量在前// #include <stdio.h>#define SIZE 500+10int 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#elsefreopen("E:\\in.txt", "r", stdin);//freopen("E:\\out.txt", "w", stdout);#endifint 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("");}}}//whilereturn 0;}


0 0
原创粉丝点击