#include <stdio.h> #include <stdlib.h> #define MAXS 2*100000+10 // 用邻接表是比较好的选择 typedef struct LinkTable{ int data; struct LinkTable *next; }LinkTable; int main() { int m,n; scanf("%d%d\n",&n,&m); LinkTable tab[MAXS]; // 初始化 for(int i=1;i<=n;i++){ tab[i].data=i; tab[i].next=NULL; } // 输入数据 for(int i=1;i<=m;i++){ int x,y; scanf("%d %d",&x,&y); LinkTable *p=&tab[x]; while(p->next) p=p->next; p->next=(LinkTable *)malloc(sizeof(LinkTable)); p->next->data=y; p->next->next=NULL; } int queue[n+2],que=1,front=1,du[n+1]; for(int i=0;i<n+1;i++){ du[i]=0; } // 统计度数 for(int i=1;i<=n;i++){ LinkTable *p=&tab[i]; while(p->next) { p=p->next; du[p->data]++; } } // 挑出度为0的顶点 for(int i=1;i<=n;i++) if(du[i]==0){queue[que++]=i;du[i]=-1;} // 出队度为0 并删除 while(front!=que){ int i=queue[front++]; LinkTable *p=&tab[i]; while(p->next) { p=p->next; du[p->data]--; } // 这一步大部分节省时间 if(front==que) for(int j=1;j<=n;j++)if(du[j]==0){queue[que++]=j;du[j]=-1;} } // 当队列满了之后 说明获取到了所有顶点 没有剩余 if(que==n+1) { printf("%d",queue[1]); for(int j=2;j<que;j++){ printf(" %d",queue[j]); } return 0; } printf("-1\n"); return 0; }