UVa10305 Ordering Tasks

        题意:n个任务,m组顺序要求,输出一组任务的排序,能满足所有要求。

        思路:DFS,拓扑排序。最先访问到的任务肯定是可以作为最后完成的,如果还有需要在这之后完成的,一定会更早访问到。图中可能会有多个连通分量,但是它们之间的顺序是无关紧要的。


#include <iostream>         
#include <stdio.h>         
#include <cmath>         
#include <algorithm>         
#include <iomanip>         
#include <cstdlib>         
#include <string>         
#include <memory.h>         
#include <vector>         
#include <queue>         
#include <stack>         
#include <map>       
#include <set>       
#include <ctype.h>         
#define INF 1000000010     
#define ll long long     
#define max3(a,b,c) max(a,max(b,c))     
#define MAXN 1000

using namespace std;     


vector<int> E[110];
int vis[110];
stack<int> s;

void _sort(int x){
	vis[x]=true;
	int siz=E[x].size();
	for(int i=0;i<siz;i++){
		if(!vis[E[x][i]]){
			_sort(E[x][i]);
		}
	}
	s.push(x);
	
}

int main(){
	int n,m;
	while(cin>>n>>m){
		if(n==0&&m==0)break;
		
		memset(vis,0,sizeof(vis));
		
		for(int i=1;i<=m;i++){
			int a,b;
			cin>>a>>b;
			E[a].push_back(b);
		}
		
		for(int i=1;i<=n;i++){
			if(!vis[i])_sort(i);
		}
		while(!s.empty()){
			int cur=s.top(); s.pop();
			cout<<cur;
			if(!s.empty())cout<<" ";
		}
		cout<<endl;
	}
	return 0;
}


你可能感兴趣的:(拓扑排序)