家谱树(拓扑排序)

【题目描述】

有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。

给出每个人的孩子的信息。

输出一个序列,使得每个人的后辈都比那个人后列出。

【输入】

第1行一个整数N(1≤N≤100),表示家族的人数;

接下来N行,第I行描述第I个人的儿子;

每行最后是0表示描述完毕。

 

【输出】

输出一个序列,使得每个人的后辈都比那个人后列出;

如果有多解输出任意一解。

 

【输入样例】

5
0
4 5 1 0
1 0
5 3 0
3 0

【输出样例】

2 4 5 3 1 

 数组版 拓扑排序

AC Code:

 


#include
#include
#include
#include
#include
#include
#include 
#include 
#include 
#include
#include
#include 
#include
#include 
#include 
#define INF 0x3f3f3f3f
#define eps 0.000000001
#define maxn  (int)1e5+10
using namespace std;
typedef pair pii;
int ans[101][101];
int r[101];
int c[101];
stack v;
int main()
{
    int T,n,m;
    cin>>T;
    for(int i=1;i<=T;++i)
    {
        while(cin>>n&&n)
        {
            c[i]++;//c[]存i的出度
            ans[i][c[i]]=n;//存与i相连的节点
            r[n]++;//r[]c存n的入度
        }
    }
    for(int i=1;i<=T;++i)
    {
        if(!r[i]) v.push(i);//入度为0,进栈
    }
    int num=0;
    do
    {
        int temp=v.top();v.pop();//出栈
        num++;
        cout<

链式前向星版——拓扑排序

AC Code:

#include
#define LL long long
#define ULL  unsigned  long long
#define maxn (LL)1e5
#define INF 0x3f3f3f3f
#define inf 0x7fffffff
#define PI  acos(-1.0)
#define pb push_back
#define re register
const double eps = 0.0000001;
using namespace std;
typedef pair pii;
inline LL sgn(double x) {
    return (x > eps) - (x < -eps);
}
using namespace std;
inline int read()
{
	re int x=0,f=1;re char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
	while (c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return x*f;
}
struct Edge{
  int next;
  int to;
}edge[maxn];
int head[maxn],tot;
int deg[maxn];
int ans[maxn];
int k = 1;
int T;
void init()
{
    memset(head,-1,sizeof(head));
}
inline void add(int from,int to)
{
    edge[++tot].next = head[from];
    edge[tot].to= to;
    deg[to]++;
    head[from] = tot;
}
void topsort()//拓扑排序
{
    queue Q;
    for(int i = 1;i<=T;++i)
    {
        if(deg[i]==0) Q.push(i);
    }
    while(Q.size())
    {
        int x = Q.front();
        ans[k++] = x;
        Q.pop();
        for(int i = head[x];~i;i = edge[i].next)
        {
            int y = edge[i].to;
            deg[y]--;
            if(deg[y]==0) Q.push(y);
        }

    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    #ifndef ONLINE_JUDGE
   // freopen("input.txt","r",stdin);
    #endif // ONLINE_JUDG
    cin>>T;
    init();
    for(int i = 1;i<=T;++i)
    {
        int to;
        while(cin>>to&&to)
        {
            add(i,to);
        }
    }
    topsort();
    for(int i = 1;i

 

你可能感兴趣的:(图论——拓扑排序)