基本原理 就是存在一个入度为0的点和一个出度为0的点 然后图中所有点都是指向同一个方向; /* 拓扑序列: 特点:有向无环图 判断:判断所有的点是否入度为0 换句话 就是入度为0的点个数是否满点的总数 过程:建图、入度数组、拓扑数组 算法:卡恩 dfs()的涂色解法和匈牙利算法很像 后面再学 匈牙利 */ #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> #include<queue> using namespace std; const int N=1e5+10; int n,m; vector<int> e[N],tp; int in[N]={0}; bool tpsort(){//判断的拓扑queue<int > q; //入队for(int i=1;i<=n;i++){if(in[i]==0){ //找入度为0的点开始遍历q.push(i);}}while(q.size()){int top=q.front();q.pop();tp.push_back(top);//符合条件就入队for(auto k:e[top]){in[k]--;//入度减1 直到为0if(in[k]==0){q.push(k);}}}return (tp.size())== n;//判断拓扑排序的个数是否等于原来数组的个数 } int main(){cin>>n>>m;int a,b;for(int i=0;i<m;i++){cin>>a>>b;in[b]+=1;//入度加1e[a].push_back(b);//顶点a的出边为b}if(!tpsort()){cout<<"-1"<<endl;}else{for(int j=0;j<n;j++){cout<<tp[j]<<" ";}cout<<endl;}return 0; }