陣線推進
題目連結
拓墣排序題,兩種實作方式,第一是BFS變形實作(queue實作),被pop出來的順序就是topological sort
第二種就是DFS搭配時間戳記,最晚離開的放在最前面
這一題是把入度為0的節點先push進priority_queue(按照字典序),當一個點處理過之後,入度變成0的所有它指向的點在push進queue裡面
拓墣排序可以用在DAG的判定以及解決具有依賴關係的問題
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
| #include <bits/stdc++.h> #define N 100001 using namespace std; int t,n,m,deg[N]; int ans[N],ind = 0;
signed main(){ cin>>t; while(t--){ memset(deg,0,sizeof(deg)); memset(ans, 0, sizeof(ans)); ind = 0; vector<int> edge[N]; cin>>n>>m; for(int i=0;i<m;i++){ int a,b;cin>>a>>b; edge[a].push_back(b); deg[b]++; } priority_queue<int,vector<int>,greater<int> > qq; for(int i=0;i<n;i++)if(deg[i]==0)qq.push(i); while(!qq.empty()){ int cur = qq.top(); qq.pop(); ans[ind++] = cur; int len = edge[cur].size(); for(int i=0;i<len;i++){ deg[edge[cur][i]]--; if(deg[edge[cur][i]]==0) qq.push(edge[cur][i]); } } if(ind==n){ cout<<ans[0]; for(int i=1;i<n;i++)cout<<" "<<ans[i]; cout<<endl; } else cout<<"QAQ"<<endl; } }
|