拓扑排序模板
记录一下模板,其余详细的在PPT里有
int topo_sort() { for(int i = 1; i <= N; ++i) if(!indegree[i]) q.push(i); int cnt = 0; //用于判断有无环 while(!q.empty()) { cnt++; int tmp = q.front(); q.pop(); for(int i = 0; i < G[tmp].size(); ++i) { int node = G[tmp][i]; indegree[node]--; if(!indegree[node]) q.push(node); } if(!q.empty()) cout << tmp << ' ‘; else cout << tmp; } if(cnt < N) return -1; //若成环则为-1 }
畅通工程:
#include <bits/stdc++.h> using namespace std; const int MX = 500+10; int n, m; vector<int> G[MX]; //queue<int> q; int indegree[MX]; priority_queue<int, vector<int>, greater<int> > q; void tupo_sort() { for(int i = 1; i <= n; ++i) if(!indegree[i]) q.push(i); while(!q.empty()) { int tmp = q.top(); q.pop(); for(int i = 0; i < G[tmp].size(); ++i) { int node = G[tmp][i]; indegree[node]--; if(!indegree[node]) q.push(node); } if(!q.empty())cout << tmp << ' '; else cout << tmp; } cout << endl; } int main() { while(scanf("%d%d", &n, &m) != EOF) { for(int i = 0; i <= n; ++i) G[i].clear(); memset(indegree, 0, sizeof(indegree)); while(m--) { int node1, node2; scanf("%d%d", &node1, &node2); G[node1].push_back(node2); indegree[node2]++; } tupo_sort(); } return 0; }
化繁为简 大巧不工

浙公网安备 33010602011771号