拓扑排序
题意为
出入n行
第i 行 为第i个人生的孩子(已零结束)
从老到小排列这n个人
代码如下emmm和sdnu的那个差不多
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int n,x,c[105],out[105];
int p = 1,cnt = 0;
vector<int>topo;
vector<int>G[105];
bool toposort()
{
while(cnt != n)
{
bool key = false;
for(int i = 1; i <=n; ++i)
{
if(out[i] == 0 &&c[i] == 0)
{
c[i] = 1;
x = i;
key = true;
break;
}
}
if(key == false)
return false;
topo.push_back(x);
cnt++;
for(int i = 0; i < G[x].size(); i++)
out[G[x][i]]--;
}
return true;
}
int main()
{
scanf("%d",&n);
int a[100000];
for(int j = 1; j <= n; ++j)
{
int i = 0;
while(p)
{
scanf("%d",&a[i]);
if(a[i] == 0)
break;
G[j].push_back(a[i]);
out[a[i]]++;
i++;
}
}
if(toposort())
{
for(int i = 0; i < n; ++i)
{
if(i != 0)
printf(" ");
printf("%d",topo[i]);
}
printf("\n");
}
return 0;
}