#include<iostream>#define MAX 501 using namespace std; int topo[501]; int graph[501][501]; int a,b; int n,m; int toposort(int n,int mat[][MAXN],int* ret)//n是点的个数,mat是邻接矩阵,ret是排序后的点列 { int d[MAXN],i,j,k; //d数组记录每个点的入度个数 for (i=0;i<n;i++) for (d[i]=j=0;j<n;d[i]+=mat[j++][i]); //这里是计算每个点的入度数 for (k=0;k<n;ret[k++]=i) { for (i=0;d[i]&&i<n;i++); //这里是寻找入度数为0的点 if (i==n) return 0; for (d[i]=-1,j=0;j<n;j++) d[j]-=mat[i][j]; // 入度数要减一 } return 1; } int main() { while(cin>>n>>m) { memset(graph,0,sizeof graph); for(int i=1;i<=m;i++) { cin>>a>>b; graph[a-1][b-1]=1; } toposort(n,graph,topo); for(int i=0;i<n;i++) { if(i) cout<<‘ ‘; cout<<topo[i]+1; } cout<<endl; } }
时间: 2024-10-10 06:32:23