<pre name="code" class="cpp">//不是保证字典序,而是要最小的尽量在前面。 /* 案例 1 4 2 3 1 4 1 3 4 1 2 */ //- -弱弱备注给自己看 # include <stdio.h> # include <algorithm> # include <queue> # include <vector> # include <string.h> using namespace std; # define N 30005 vector<int>g[N]; int vis[N],ans[N]; int n,m; int an; void slove() { int i; priority_queue<int> Q;//优先队列 for(i=1;i<=n;i++) if(!vis[i])//没有访问过 Q.push(i);// 1 2 while(!Q.empty()) { int now=Q.top ();//top 第一次为2 // printf(" %d\n",now); Q.pop(); for(i=0;i<g[now].size();i++)//2 g[now].size()均为0 // 1 为 2 g[1][0]=3 g[1][1]=4 { // printf("%d\n",g[now][i]); // printf(" %d\n",vis[g[now][i]]); vis[g[now][i]]--; if(vis[g[now][i]]==0) Q.push(g[now][i]); }//完成for后推进了 3 4 ans[an++]=now;//逆序 2 1 4 3 } } int main() { int t,i,a,b; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m); for(i=1;i<=n;i++)//初始化 g[i].clear(); an=0; for(i=0;i<m;i++) { scanf("%d%d",&a,&b); vis[a]++; g[b].push_back(a);//vtctor尾部加入一个数据 //b后面插一个a 即g[b][a]++ } slove(); for(i=an-1;i>=0;i--)//逆向输出 { if(i==an-1) printf("%d",ans[i]); else printf(" %d",ans[i]); } printf("\n"); } return 0; }
原文地址:http://blog.csdn.net/lp_opai/article/details/38015299