#include<stdio.h> #include<string.h> #include<stdlib.h> int indegree[505],map[505][505];//indegree記錄每一個節點的入度和。map記錄那些邊是相關聯的 int tp[505],k;//記錄拓撲序列。 void topsort(int n) { int i,j,v; k=0; memset(tp,0,sizeof(tp)); for(i=1;i<=n;i++)//找n次,每次找到了,就又重頭開始找。 { for(j=1;j<=n;j++)//尋找入度爲0的節點。 { if(indegree[j]==0) { indegree[j]=-1;//找到後就除去,不然下次就又會找這個 tp[k++]=j;//記錄拓撲序列中 for(v=1;v<=n;v++)//把該節點相關的弧都刪除。 { if(map[j][v]) indegree[v]--; } break;//找到就退出循環。重頭開始找。 } } } } int main() { int n,m,p1,p2,i,j; while(scanf("%d%d",&n,&m)!=EOF) { memset(indegree,0,sizeof(indegree)); memset(map,0,sizeof(map)); for(i=0;i<m;i++) { scanf("%d%d",&p1,&p2); if(map[p1][p2]==0) { map[p1][p2]=1; indegree[p2]++; } } topsort(n); for(i=0;i<k-1;i++) { printf("%d ",tp[i]); } printf("%d\n",tp[k-1]); } return 0; }