https://www.acwing.com/problem/content/850/
#include<bits/stdc++.h> using namespace std; const int N=100010; vector<int> p[N]; //vector变长数组来写邻接表 queue<int> q; //队列操作 int d[N]; //统计入度 int n,m,cnt,ans[N]; //ans数组记录答案 int main() { cin>>n>>m; for(int i=1;i<=m;i++) { int x,y; cin>>x>>y; p[x].push_back(y); //构造邻接表 d[y]++; //入度++ } for(int i=1;i<=n;i++) { if(!d[i]) q.push(i); //统计最初入度,找入度为0的点 } while(q.size()) { int t=q.front(); q.pop(); ans[cnt++]=t; for(int i=0;i<p[t].size();i++) { d[p[t][i]]--; //删边操作 if(d[p[t][i]]==0) q.push(p[t][i]); //如果删完边后入度为0了,放入队列 } } if(cnt==n) for(int i=0;i<cnt;i++) printf("%d ",ans[i]); //存在拓扑序列打印 else printf("-1"); }
标签:有向图,int,拓扑,入度,848,++,ans From: https://www.cnblogs.com/ljq2022/p/17273658.html