525
拓扑排序的原理就是在队列里面操作,先将图存储起来,然后每次选择入度为0的点作为开始,每次选择这个入度为0的点作为开始,逐步释放以他指向的点,如果被指向的点的入度减为0,也加入队列之中,加入队列的元素就是其中一个拓扑排序.同时也可用来检测这个有向图是否形成环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include <bits/stdc++.h> using namespace std; const int maxn = 2e5+10; int ind[maxn]; int n,m; map<int, vector <int> > mp; vector<int> va;
void aov() { int t = 0; queue<int> q; for(int i = 1;i<=n;i++) { if(ind[i]==0) { t++; q.push(i); va.push_back(i); } } while(!q.empty()) { int tp = q.front(); q.pop(); for(int vtx: mp[tp]) { ind[vtx]--; if(ind[vtx]==0) { q.push(vtx);
va.push_back(vtx); t++; } } } if(t!=n) { cout << -1; return; } for(int i = 0;i<n;i++) { cout << va[i]; if(i!=n-1) cout << " "; } }
int main() { cin >> n >> m; for(int i = 0;i<m;i++) { int a,b;cin >> a >> b; mp[a].push_back(b); ind[b]++; } aov(); return 0; }
|