九度 OJ 1449 确定比赛名次

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xp1994816/article/details/52463474

嘿。。学习学习。。拓扑排序。。

#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;

vector<int> edge[501];
queue<int> Q;

int main()
{
	int n , m;
	int indegree[501];
	bool mark[501];
	while(scanf("%d%d",&n,&m) != EOF){
		for(int i = 1 ; i <= n ; ++i){
			indegree[i] = 0;
			mark[i] = false;
			edge[i].clear();
		}
		while(m--){
			int a , b;
			scanf("%d%d",&a,&b);
			indegree[b]++;
			edge[a].push_back(b);
		}
		while(!Q.empty()) Q.pop();
		for(int i = 1 ; i <= n ; ++i){
			if(indegree[i] == 0){
				Q.push(i);
				break;					//将最小的入度为0的点入队即可。
			}
		}

		int cnt = 0;						//记录输出的结点个数
		while(!Q.empty()){
			int nowp = Q.front();
			Q.pop();
			++cnt;

			if(cnt == n){					
				printf("%d\n",nowp);	
			}
			else{
				printf("%d ",nowp);
			}

			mark[nowp] = true;	//标记输出的“小”点

			for(int j = 0 ; j < edge[nowp].size() ; ++j){
				indegree[ edge[nowp][j] ]--;
			}
			for(int i = 1 ; i <= n ; ++i){			//仍然只取一个最小的入度为0的点入队
				if( indegree[i] == 0 && mark[i] == false){	//mark[i]用来排除已输出的点
					Q.push(i);
					break;
				}
			}
		}	
	}
	return 0;
}



猜你喜欢

转载自blog.csdn.net/xp1994816/article/details/52463474
今日推荐