题目链接 http://poj.org/problem?id=2367
题意就是给定一系列关系,按这些关系拓扑排序。
#include<cstdio> #include<cstring> #include<queue> #include<vector> #include<algorithm> using namespace std; const int maxn=200; int ans; int n; int in[maxn]; //记录入度 int num[maxn]; //记录答案 vector<int>E[maxn]; //记录边 void topo_sort() //拓扑排序 {queue<int>q;for(int i=1; i<=n; i++)if(!in[i]){q.push(i);in[i]=-1;}while(!q.empty()){int now=q.front();num[ans]=now;ans++;q.pop();for(int i=0; i<E[now].size(); i++)if(in[E[now][i]]>0)in[E[now][i]]--;for(int i=1; i<=n; i++)if(!in[i]){in[i]=-1;q.push(i);}}return ; } int main() {while(~scanf("%d",&n)){memset(num,0,sizeof(num));memset(in,0,sizeof(in));for(int i=0;i<maxn;i++)E[i].clear();ans=0;for(int i=1; i<=n; i++){int x;while(scanf("%d",&x)){if(!x)break;E[i].push_back(x);in[x]++;}sort(E[i].begin(),E[i].end());}topo_sort();printf("%d",num[0]);for(int i=1; i<n; i++)printf(" %d",num[i]);puts("");}return 0; }