拓扑排序—入门简单题—Genealogical tree

题目链接

题目大意:

给出n个点,给出n种关系,第i行对应i->x(先后顺序),求出一个序列,使得满足以上所有的关系.如果有多个这样的序列,求出一个就行。测试数据有大于等于1个的序列。

思路:这是最基本的拓扑排序的题,用G[maxn]用来存图,入度为0存一个,ans用来存输出顺序。

代码:

 

#include<cstdio>  
#include<cstring>  
#include<vector>  
#include<queue>  
using namespace std;  
const int maxn=100+10;  
int n;  
vector<int> G[maxn];  
int in[maxn];  
int ans[maxn];  
void topo()  
{  
    queue<int> Q;  
    for(int i=1;i<=n;i++)
        if(in[i]==0)  
        Q.push(i);  
    int cnt=0;  
    while(!Q.empty())  
    {  
        int u=Q.front(); 
        Q.pop();  
        ans[cnt++]=u;  
        for(int i=0;i<G[u].size();i++)  
        {  
            int v=G[u][i];  
            if(--in[v]==0) Q.push(v);  
        }  
    }  
}  
int main()  
{  
    while(scanf("%d",&n)==1&&n)  
    {  
        for(int i=1;i<=n;i++)  
        {  
            G[i].clear();//初始化  
            in[i]=0;     //初始化  
            int v;  
            while(1)  
            {  
                scanf("%d",&v);  
                if(v==0) break;  
                G[i].push_back(v);  
                in[v]++;  
            }  
        }  
        topo();  
        printf("%d",ans[0]);  
        for(int i=1;i<n;i++)  
            printf(" %d",ans[i]);  
        printf("\n");  
    }  
    return 0;  
}  

 

 

 

 

 

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/xianpingping/article/details/79179247
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞