详细的报告见http://imlazy.ycool.com/post.2144071.html 关键的地方就是要让标号小的尽量往前放,对于平行路径,小的头部不一定排在前面,但大的尾部一定排在后面! 代码: #include<iostream> #include<queue> #include<cstdio> #include<memory.h> using namespace std; const int MAX=205; struct node { int v,next; }g[MAX*MAX]; int adj[MAX],out[MAX],res[MAX],wei[MAX]; int e,n,m; int topsort() { priority_queue<int>que; int i,u,v,cnt=n; for(i=1;i<=n;i++) if(out[i]==0) que.push(i); while(!que.empty()) { u=que.top(); que.pop(); res[u]=cnt--; for(i=adj[u];i!=-1;i=g[i].next) { v=g[i].v; if(--out[v]==0) que.push(v); } } return cnt==0; } int main() { int i,j,T; scanf("%d",&T); while(T--) { e=0; memset(adj,-1,sizeof(adj)); memset(out,0,sizeof(out)); scanf("%d%d",&n,&m); while(m--) { scanf("%d%d",&i,&j); out[i]++; g[e].v=i; g[e].next=adj[j]; adj[j]=e++; } //cout<<"yes"<<endl; if(topsort()) { for(i=1;i<=n;i++) { printf("%d ",res[i]); } printf("/n"); } else printf("-1/n"); } return 0; }