这题比较简单,就是拓扑排序,而且肯定是有向无环图,直接DFS即可。
注意数据读取,只要 n 和 m 有一个不为0即可。。。
不考虑是否存在环:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100 + 10;
int m,n,t;
int visited[maxn];
int order[maxn];
int A[maxn][maxn];
void DFS(int i){
for(int j = 1;j <= n;j++){
if(!visited[j] && A[i][j]) DFS(j);
}
order[t--] = i;
visited[i] = 1;
}
void TopoSort(){
for(int i = 1;i <= n;i++){
if(!visited[i]) DFS(i);
}
for(int i = 1;i < n;i++) printf("%d ",order[i]);
printf("%d\n",order[n]);
}
int main(){
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout);
while(scanf("%d %d",&n,&m) && (n || m)){
t = n;
memset(A,0,sizeof(A));
memset(visited,0,sizeof(visited));
int a,b;
for(int i = 0;i < m;i++){
scanf("%d %d",&a,&b);
A[a][b] = 1;
}
TopoSort();
}
return 0;
}
考虑是否存在环:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100 + 10;
int m,n,t;
int visited[maxn];
int order[maxn];
int A[maxn][maxn];
bool DFS(int i){
visited[i] = -1;
for(int j = 1;j <= n;j++){
if(A[i][j]){
if(visited[j] < 0) return false;
else if(!visited[j] && !DFS(j)) return false;
}
}
order[t--] = i;
visited[i] = 1;
return true;
}
bool TopoSort(){
for(int i = 1;i <= n;i++) if(!visited[i])
if(!DFS(i)) return false;
return true;
}
int main(){
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout);
while(scanf("%d %d",&n,&m),n | m){
t = n;
memset(A,0,sizeof(A));
memset(visited,0,sizeof(visited));
int a,b;
for(int i = 0;i < m;i++){
scanf("%d %d",&a,&b);
A[a][b] = 1;
}
TopoSort();
for(int i = 1;i < n;i++) printf("%d ",order[i]);
printf("%d\n",order[n]);
}
return 0;
}