题意: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;
}