題目連接ios
思路:spa
若是n=3。 3->1,2(孤立) ,那麼正向拓撲,應該是2 3 1,由於1要比2先出來,因此這種不知足。 逆向: 1->3,2 。此時若優先級從大到小,則2 1 3,逆向輸入就是3 1 2 。.net
#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(); } }