题意
给n个数和m个二元组(u,v),表示u排在v的前面,对n个数进行排序
思路
拓扑排序题
拓扑排序的思路简述如下:
1. 状态标记:共三种,-1表示访问中,0表示未访问,1表示已访问,由数组vis保存
2. dfs终止的判别条件:如果存在环,则不存在,退出;反之把当前结点加入拓扑排序的首部(线性序列的当前第一个位置,随着排序的进行,这个位置会不断前移)
3. 通过topo数组记录拓扑排序
总结
第一次可以因为例题中给出的部分代码写全代码,有进步。
拓扑排序的思路搜的别人的。
#include <iostream> #include <cstdio> #include <vector> #include <cstring> #include <string> const int maxn = 1000; using namespace std; int n, m; int u ,v, t; int G[maxn][maxn], vis[maxn], topo[maxn]; bool dfs(int u) { vis[u] = -1; for(int v = 1; v <= n; v++){ if(G[u][v]) { if(vis[v] < 0) return false; //存在有向环 else if(!vis[v] && !dfs(v)) return false; //v没被访问过,且访问后发现有环 } } vis[u] = 1; topo[--t] = u; return true; } int main() { //freopen("in.txt","r",stdin); while(cin >> n >> m && n){ memset(G, 0, sizeof G); memset(vis, 0, sizeof vis); for(int i = 0; i < m; i++){ cin >> u >> v; G[u][v] = 1; } t = n; for(int u = 1; u <= n; u++) if(!vis[u]) dfs(u); for(int i = 0; i < n; i++){ if(i != n-1) cout << topo[i] << " "; else cout << topo[i] << endl; } } return 0; }