题目意思:给定两个数n , m .n是任务的编号从1~n, m则是有m个关系式.求出一种做该任务的顺序(答案不唯一)。
解题思路:这一题是很简单的拓扑排序,直接利用拓扑排序的模板,然后注意输出就可以了。
代码:
//直接利用拓扑排序的模板
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 110;
int num[MAXN][MAXN];
int ans[MAXN] , vis[MAXN];
int n , m , t;
//深搜
bool dfs(int i){
for(int j = 1 ; j <= n; j++){
if(num[i][j] == 1){//如果对应点值为1才继续
if(!vis[j])//没被标记过就dfs
dfs(j);
}
}
vis[i] = 1;//更新vix[i]
ans[t--] = i;//从后往前存储
return true;
}
//拓扑排序
bool toposort(){
t = n;//t的初始化为n
memset(vis , 0 , sizeof(vis));//初始化为0
for(int i = 1 ; i <= n; i++){
if(vis[i] == 0){//如果没被标记过就执行dfs
dfs(i);
}
}
return true;
}
//主函数
int main(){
int i , j ,k;
while(cin>>n>>m){
if(m == 0 && n == 0)
break;
memset(num , 0 , sizeof(num));
memset(ans , 0 , sizeof(ans));
memset(vis , 0 , sizeof(vis));
for(k = 0 ; k < m ; k++){
scanf("%d%d" , &i , &j);
num[i][j] = 1;
}
toposort();
k = 1;
//输出格式(最后一个没有空格)
while(ans[k] != 0){
if(k == 1)
cout<<ans[k];
else
cout<<" "<<ans[k];
k++;
}
cout<<endl;
}
return 0;
}