题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2367 题意看样例也能猜到一点,就是top排序,可以说这是道没人做的标准水题。自己乱写一些提交1y,以下是我写的比较乱的代码: #include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int Max=102; int n; struct P{ int num; P*next; }*Head[Max]; int dNum[Max]; int stack[Max]; void add(int s,int e) { P *node=new P; node->num=s; node->next=Head[e]; Head[e]=node; dNum[s]++; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) { Head[i]=NULL; } memset(dNum,0,sizeof(dNum)); for(int i=1;i<=n;i++) { while(1) { int temp; scanf("%d",&temp); if(temp==0) break; add(i,temp); } } for(int i=1;i<=n;i++) { if(!Head[i]) { Head[i]=new P; Head[i]->num=i; Head[i]->next=NULL; } } int top=0; for(int i=1;i<=n;i++) { if(dNum[i]==0) { stack[++top]=i; break; } } int nn=0; int flag[Max]={false}; int out[Max]; while(top) { int temp=stack[top--]; flag[temp]=true; out[++nn]=temp; P*ptr=Head[temp]; for(;ptr;ptr=ptr->next) { dNum[ptr->num]--; if(!flag[ptr->num]&&dNum[ptr->num]==0) { stack[++top]=ptr->num; } } } printf("%d",out[n]); for(int i=n-1;i>=1;i--) printf(" %d",out[i]); printf("/n"); } return 0; }