zoukankan      html  css  js  c++  java
  • 6-16 Topological Sort(25 分)

    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
    
    代码:
     
    bool TopSort( LGraph Graph, Vertex TopOrder[] )
    {
        int c = 0;
        int book[Graph -> Nv],h[Graph -> Nv + 1],head = 0,tail = 0;
        PtrToAdjVNode t;
        for(int i = 0;i < Graph -> Nv;i ++)
            book[i] = 0;
        for(int i = 0;i < Graph -> Nv;i ++)
        {
            t = Graph -> G[i].FirstEdge;
            while(t)
            {
                book[t -> AdjV] ++;
                t = t -> Next;
            }
        }
        for(int i = 0;i < Graph -> Nv;i ++)
        {
            if(book[i] == 0)
            {
                h[tail ++] = i;
            }
        }
        if(head == tail)return false;
        while(head < tail)
        {
            t = Graph -> G[h[head]].FirstEdge;
            while(t)
            {
                if(book[t -> AdjV] <= 0)return false;
                book[t -> AdjV] --;
                if(book[t -> AdjV] == 0)h[tail ++] = t -> AdjV;
                t = t -> Next;
            }
            book[h[head]] = -1;
            TopOrder[c ++] = h[head ++];
        }
        if(c != Graph -> Nv)return false;///有回路
        return true;
    }
  • 相关阅读:
    Hadoop整理二(Hadoop分布式存储系统HDFS)
    Hadoop整理一(初识Hadoop)
    Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match
    Oracle登录
    神经网络一(用tensorflow搭建简单的神经网络并可视化)
    Qt程序启动画面播放(gif与swf两种动画格式)
    VS2008+GDI实现多幅图像的GIF动画制作
    C++读取特定路径下文件目录及文件名称
    求助——数据处理问题
    VC6.0读取Excel文件数据
  • 原文地址:https://www.cnblogs.com/8023spz/p/7752008.html
Copyright © 2011-2022 走看看