zoukankan      html  css  js  c++  java
  • hdu---1285--拓扑排序

     拓扑排序的基本思想为:

    1.从有向图中选一个无前驱的顶点输出

    2.将此顶点和以它为起点的弧删除

    3.重复<1><2>操作直到不存在无前驱的顶点

    4.若此时输出的顶点数小于有向图中的顶点数,则说明有向图中存在回路,否则输出的顶点的顺序即为一个拓扑排序。

    此题是最简单的最基本的拓扑排序

    Description

    有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。 

    Input

    输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。 

    Output

    给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。 
    其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。 

    Sample Input

    4 3
    1 2
    2 3
    4 3

    Sample Output

    1 2 4 3
     
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    #include<vector>
    #include<queue>
    #include<algorithm>
    
    using namespace std;
    typedef long long LL;
    
    const int maxn=1005;
    const int INF=0x3f3f3f3f;
    
    int maps[maxn][maxn];
    int indegree[maxn];
    int p[maxn];
    int n, m;
    
    void toposort()
    {
        int k=0;
        while(k<n)///如果p数组里面的元素小于n就继续就进行循环
        {
            for(int i=1; i<=n; i++)
            {
                if(!indegree[i])
                {
                    indegree[i]--;///将无前驱的indegree里面的值减为-1,否则无法再找到其他无前驱的点数
                    p[k++]=i;///把找到数存到p数组
    
                    for(int j=1; j<=n; j++)
                        if(maps[i][j])
                            indegree[j]--;///将此顶点和以它为起点的弧删除
                    break;
                }
            }
        }
    }
    int main()
    {
        while(~scanf("%d %d", &n, &m))
        {
            memset(maps, 0, sizeof(maps));
            memset(p, 0, sizeof(p));
            memset(indegree, 0, sizeof(indegree));
            while(m--)
            {
                int a, b;
                scanf("%d %d", &a, &b);
                if(!maps[a][b])///这个地方要细心
                {
                    maps[a][b]=1;///将有向图标记
                    indegree[b]++;///记录后驱次数
                }
            }
    
            toposort();
    
            for(int i=0; i<n; i++)
                printf("%d%c", p[i], i==n-1?'
    ':' ');
        }
        return 0;
    }
  • 相关阅读:
    unnitest简单场景应用
    接口基础之request
    docker常用命令
    管理之心理学
    管理团队挑战和提升
    如何留下核心成员
    管理之面试技巧
    复杂接口请求怎样写http请求
    gitlab使用(一)
    不使用AutoLayout快速兼容适配iPhone6/6 Plus
  • 原文地址:https://www.cnblogs.com/w-y-1/p/5778996.html
Copyright © 2011-2022 走看看