UVA10305_OrderingTask(简单的拓扑排序)
#include<bits/stdc++.h> using namespace std; const int maxn = 100 + 5; int m, n; int G[maxn][maxn]; int top[maxn], cnt; int vis[maxn]; void dfs(int u) { vis[u] = 1; for(int i = 1; i <= n; i++){ if(G[u][i] && !vis[i]){ dfs(i); } } top[--cnt] = u; } void solve() { cnt = n; memset(vis, 0, sizeof(vis)); for(int i = 1; i <= n; i++){ if(!vis[i]){ dfs(i); } } cout << top[cnt]; for(int i = cnt + 1; i < n; i++){ cout << " " << top[i]; } cout << endl; } int main() { while(cin >> n >> m && m && n){ memset(G, 0, sizeof(G)); for(int i = 0; i < m; i++){ int u, v; cin >> u >> v; G[u][v] = 1; } solve(); } return 0; }
一个坑:题目说的是以0 0结尾,但是while(cin >> n >> m && n && m) 无法AC,只能是while(cin >> n >> m && n)