题目链接:【POJ 2367】
将n(n>=1 &&n<=100)个人排序,输入n行,第i行输入无数个m,表示第m个人排在第i个人的后面,输入的m=0就停止第i行输入,输出排好的序列
in[i]=x表示有x个人在i的前面,link[i][j]=1表示ij有先后关系,每次都将in[i]=0的放到队列中去
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
int n, len, m;
int in[110], link[110][110], p[110];
void find()
{
queue<int>q;
for(int i=1; i<=n; i++)
{
if(!in[i]) q.push(i);
}
len=0;
while(!q.empty())
{
int s=q.front();
q.pop();
p[len++]=s;
for(int i=1; i<=n; i++)
{
if(link[s][i])
{
link[s][i]=0;
in[i]--;
if(in[i]==0) q.push(i);
}
}
}
}
int main()
{
memset(in, 0, sizeof(in));
memset(link, 0, sizeof(in));
cin>>n;
for(int i=1; i<=n; i++)
{
while(cin>>m)
{
if(m==0) break;
link[i][m]=1;
in[m]++;
}
}
find();
for(int i=0; i<len; i++)
{
printf("%d ", p[i]);
}
printf("\n");
return 0;
}