逃生(逆拓扑排序
思路:
如果n=3。 3->1,2(孤立) ,那么正向拓扑,应该是2 3 1,因为1要比2先出来,所以这种不满足。 逆向: 1->3,2 。此时若优先级从大到小,则2 1 3,逆向输入就是3 1 2 。
#include<iostream> #include<cstdio> #include <cctype> #include<algorithm> #include<cstring> #include<cmath> #include<string> #include<cmath> #include<set> #include<vector> #include<stack> #include<queue> #include<map> using namespace std; #define ll long long #define mem(a,x) memset(a,x,sizeof(a)) #define se second #define fi first const ll mod=998244353; const int INF= 0x3f3f3f3f; const int N=2e5+5; int n,m; int in[30005],ans[30005]; priority_queue<int > q; vector<int>v[30005]; void bfs() { int cnt=0; for(int i=1;i<=n;i++) { if(in[i]==0) q.push(i); } while(!q.empty()) { int t=q.top(); q.pop(); ans[++cnt]=t; for(int i=0;i<v[t].size();i++) { in[v[t][i]]--; if(in[v[t][i]]==0) q.push(v[t][i]); } } for(int i=cnt;i>1;i--) printf("%d ",ans[i]); printf("%d\n",ans[1]); } int main() { int T; cin>>T; int x,y; while(T--) { mem(v,0); mem(in,0); mem(ans,0); while(!q.empty()) q.pop(); scanf("%d%d",&n,&m); while(m--) { scanf("%d%d",&x,&y); v[y].push_back(x); in[x]++; //cout<<in[x]; } bfs(); } }