zoukankan      html  css  js  c++  java
  • 图--拓扑排序--p153

    源程序:在vc++6.0中运行通过

    //  c0,c1,c2,c3,c4四个结点,在程序中和0,1,2,3,4来表示

    //  main.cpp

    //  top_sort

    //

    //  Created by duanqibo on 2019/12/20.

    //  Copyright © 2019年 duanqibo. All rights reserved.

    //

    #include <stdio.h>

    #include <stdlib.h>

    const int vnum=20;

    typedef struct node    //定义栈结构

    {

        int data;

        struct node *next;

    }*LkStk,LkStack;

    typedef struct arcnode

    {

        int adjvex;

        struct arcnode *nextarc;

        //OtherInfo info;

    }ArcNode;

    typedef struct vexnode

    {

        char data;

        struct arcnode *firstarc;

    }VNode, AdjList[vnum];

    typedef struct gp

    {

        AdjList adjlist;    //vertices;

        int vexnum, arcnum;

    }Graph;

    //并声明一个int 类型的indegree[]数组,初始化为0:

    int indegree[vnum] = { 0 };

    //用于记录下标节点的入度。

    //入栈函数:

    LkStk Push(LkStk S, int e)

    {

        LkStk p;

        p = (LkStk)malloc(sizeof(LkStack));

        p->data = e;

        p->next = S;

        S = p;

        return S;

    }

    //出栈操作

    LkStk Pop(LkStk S, int *e)

    {

        LkStk p;

        p = S;

        //if (!p)

        //    return NULL;

        *e = p->data;

        S = S->next;

        free(p);

        return S;

    int LocateVex(Graph *G, char v)

    {

        int i;

        for (i = 0; i < (G->vexnum); i++)

        {

            if (v == G->adjlist[i].data)

                return i;

        }

    }

    void CreateUDG(Graph *G)

    {

        int i, j, k;

        char v1, v2;

        ArcNode *p1;

        printf("输入总节点数和总边数:");

        scanf("%d%d", &G->vexnum, &G->arcnum);

        fflush(stdin);

        printf("输入各个节点的值:");

        for (i = 0; i < G->vexnum; i++)

        {

            scanf("%c", &G->adjlist[i].data);

            G->adjlist[i].firstarc = NULL;

        }

        for (k = 0; k < G->arcnum; k++)

        {

            fflush(stdin);

            printf("输入一条边的两个节点:");

            scanf("%c %c", &v1, &v2);

            i = LocateVex(G, v1);

            j = LocateVex(G, v2);

            p1 = (arcnode *)malloc(sizeof(arcnode));

            p1->adjvex = j;

            p1->nextarc = G->adjlist[i].firstarc;

            G->adjlist[i].firstarc = p1;

            indegree[j]++;

        }

    }

    //注意在创建图过程中记录节点的入度。

    //拓扑排序算法:

    int TopologicalSort(Graph G, int *topo)

    {

        int i, m, k;

        LkStk S;

        ArcNode *p;

        S = NULL;

        for (i = 0; i < G.vexnum; i++)

        {

            if (!indegree[i])

                S = Push(S, i);

        }

        m = 0;

        while(S)

        {

            S = Pop(S, &i);

            topo[m] = i;

            ++m;

            p = G.adjlist[i].firstarc;

            while (p != NULL)

            {

                k = p->adjvex;

                --indegree[k];

                if (indegree[k] == 0)

                    S = Push(S, k);

                p = p->nextarc;

            }

        }

        topo[m] = -1;

        if (m < G.vexnum)

            return 0;

        else

            return 1;

    }

    //主函数

    int main(void)

    {

        Graph G;

        int i;

        int topo[99] = { 0 };

        CreateUDG(&G);

        if (TopologicalSort(G, topo))

        {

            for (i = 0; topo[i] != -1; i++)

            {

                printf("%c ", G.adjlist[topo[i]].data);

            }

        }

        else

            printf("错误");

        printf(" ");

        system("pause");

        return 1;

    }

    运行结果:

     

  • 相关阅读:
    cf1100 F. Ivan and Burgers
    cf 1033 D. Divisors
    LeetCode 17. 电话号码的字母组合
    LeetCode 491. 递增的子序列
    LeetCode 459.重复的子字符串
    LeetCode 504. 七进制数
    LeetCode 3.无重复字符的最长子串
    LeetCode 16.06. 最小差
    LeetCode 77. 组合
    LeetCode 611. 有效三角形个数
  • 原文地址:https://www.cnblogs.com/duanqibo/p/12073309.html
Copyright © 2011-2022 走看看