• pta ——Topological Sort(拓扑排序)


    Write a program to find the topological order in a digraph.

    Format of functions:

    bool TopSort( LGraph Graph, Vertex TopOrder[] );

    where LGraph is defined as the following:

    typedef struct AdjVNode *PtrToAdjVNode; 
    struct AdjVNode{
        Vertex AdjV;
        PtrToAdjVNode Next;
    };
    
    typedef struct Vnode{
        PtrToAdjVNode FirstEdge;
    } AdjList[MaxVertexNum];
    
    typedef struct GNode *PtrToGNode;
    struct GNode{  
        int Nv;
        int Ne;
        AdjList G;
    };
    typedef PtrToGNode LGraph;

    The topological order is supposed to be stored in TopOrder[] where TopOrder[i] is the i-th vertex in the resulting sequence. The topological sort cannot be successful if there is a cycle in the graph – in that case TopSort must return false; otherwise return true.

    Notice that the topological order might not be unique, but the judge’s input guarantees the uniqueness of the result.

    Sample program of judge:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef enum {false, true} bool;
    #define MaxVertexNum 10  /* maximum number of vertices */
    typedef int Vertex;      /* vertices are numbered from 0 to MaxVertexNum-1 */
    
    typedef struct AdjVNode *PtrToAdjVNode; 
    struct AdjVNode{
        Vertex AdjV;
        PtrToAdjVNode Next;
    };
    
    typedef struct Vnode{
        PtrToAdjVNode FirstEdge;
    } AdjList[MaxVertexNum];
    
    typedef struct GNode *PtrToGNode;
    struct GNode{  
        int Nv;
        int Ne;
        AdjList G;
    };
    typedef PtrToGNode LGraph;
    
    LGraph ReadG(); /* details omitted */
    
    bool TopSort( LGraph Graph, Vertex TopOrder[] );
    
    int main()
    {
        int i;
        Vertex TopOrder[MaxVertexNum];
        LGraph G = ReadG();
    
        if ( TopSort(G, TopOrder)==true )
            for ( i=0; i<G->Nv; i++ )
                printf("%d ", TopOrder[i]);
        else
            printf("ERROR");
        printf("
    ");
    
        return 0;
    }
    
    /* Your function will be put here */

    Sample Input 1 (for the graph shown in the figure):

    这里写图片描述

    5 7
    1 0
    4 3
    2 1
    2 0
    3 2
    4 1
    4 2

    Sample Output 1:

    4 3 2 1 0

    Sample Input 2 (for the graph shown in the figure):

    这里写图片描述

    5 8
    0 3
    1 0
    4 3
    2 1
    2 0
    3 2
    4 1
    4 2

    Sample Output 2:

    ERROR

    思路:
    拓扑排序,题目代码没求各点的入度,这个自己求。

    代码:

    int In[MaxVertexNum];//存储各点入度 
    
    bool TopSort( LGraph Graph, Vertex TopOrder[] ){
        memset(In,0,sizeof(In));
        for(int i=0 ; i<Graph->Nv ; i++){
            PtrToAdjVNode t = Graph->G[i].FirstEdge;
            while(t){
                In[t->AdjV]++;
                t = t->Next;
            }
        }                        //求各点入度 
    
        int queue[Graph->Nv];     //建立队列存储入度为零的点 
        int head,tail;
        head = tail = 0;
        for(int i=0 ; i<Graph->Nv ; i++){
            if(In[i] == 0){
                queue[tail++] = i;
                break;
            }
        }                       //找第一个入度为零的点 
    
        int index = 0;
        while(head<tail){
            int node = queue[head++];
            TopOrder[index++] = node;
            PtrToAdjVNode t = Graph->G[node].FirstEdge;
            while(t){
                In[t->AdjV]--;
                if(In[t->AdjV] == 0)queue[tail++] = t->AdjV;
                t = t->Next;
            }
        }
    
        if(index == Graph->Nv)return true;
        else return false;
    }
  • 相关阅读:
    Install and Configure OSSEC on Debian 7&8
    手动替换WORDPRESS的GOOGLE字体等加速【非插件】
    LDAP常用命令解析
    Install guide for OpenLDAP and GOsa 2 on Ubuntu & Debian
    Linux 转发 email Redirect local emails to a remote email account
    Ubuntu,忘记了root密码,怎么重置?
    LDAP 原理图解
    CAS实现SSO单点登录原理
    cacti 安装与 与不能显示图像故障解决方案
    LDAP概念和原理
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514202.html
Copyright © 2020-2023  润新知