• 【图】拓扑排序


    参考 CSDN拓扑排序的原理及Java实现

      拓扑排序C++实现

      拓扑排序百度百科

    若不是上了学堂在线的数据结构课程,我估计今后不做技术的话,都接触不到图的拓扑排序这个概念了。先是看了百度百科的解释,拓扑排序现实中的应用是选课,即某些课程需要一些先修课程的学习后才适合上。比如数据结构的学习,是离散数学、编程语言,后者是前者的先修课程。

    拓扑排序定义:将有向无环图DAG中的顶点以线性方式进行排序。即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,顶点u总是在顶点v的前面

    1.创建图;

    2.将图中入度为0的顶点压入栈中;

    3.将栈顶元素出栈,并将其邻接顶点的入度减1,若该邻接顶点的入度等于0,将该邻接顶点入栈;否则将边更新为栈顶元素的另一条边。

    4.重复3,直至栈空。

    一道关于OJ上的旅行商的问题,对图中可能通过的点的最大个数进行统计。实质是拓扑排序,但并不完全是排序,这里需要对一条通路上的顶点个数进行统计。

    如图所示,1~6个村庄,但不是任意两个村庄之间都能相通,统计最长道路经过的村庄数,此时该结果为4.

    以下是deadline截止前写的,但OJ提交后没有结果,只有一个compilation error编译错误的指示。codeblocks上测试了几个是通过的,或许还有错误吧,不过稍微能理解图的创建和拓扑排序了。

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <iostream>
      4 #define MAX_VEX 1000001 //顶点
      5 
      6 #define _Size 100000 //栈的大小
      7 
      8 struct Stack{
      9     int *element;
     10     int top;
     11     int _size;
     12 
     13     void initialStack(){
     14         element = new int[_Size];
     15         top = -1;
     16         _size = _Size;
     17     }
     18     void push(int x){
     19         element[++top] = x;
     20     }
     21     int pop(){
     22         return element[top--];
     23     }
     24 }S;
     25 
     26 
     27 typedef struct edgeNode {
     28     int adjvex;
     29    // int num;
     30     edgeNode *nextedge;
     31 }edgeNode;
     32 
     33 typedef struct vexNode{
     34     int data;
     35     edgeNode *firstedge;
     36     int inDegree = 0; //入度初始为0
     37 }vexNode;
     38 
     39 typedef struct vexList{
     40     vexNode vexlist[MAX_VEX];
     41     int vexnum, edgenum;
     42 }vexList;
     43 
     44 void GraphList(vexList &G, int n, int m){
     45     G.edgenum = m;
     46     G.vexnum = n;
     47     for (int i = 1; i < n + 1; i++){
     48         G.vexlist[i].data = i; // 顶点从1~n;
     49         G.vexlist[i].firstedge = NULL;
     50 
     51     }
     52     for (int i = 0; i < m ; i++){  // 有向边
     53         int from, to;
     54         scanf("%d %d", &from, &to);
     55         edgeNode *p = new edgeNode;
     56         p->adjvex = to;
     57         p->nextedge = G.vexlist[from].firstedge;
     58         G.vexlist[from].firstedge = p;
     59     }
     60 }
     61 
     62 int Tsort(vexList &G){
     63    // Stack;
     64     S.initialStack();
     65     edgeNode *p;
     66     int cnt = 1;
     67     for (int i = 1; i < G.vexnum + 1; i++){
     68         p = G.vexlist[i].firstedge;
     69         while (p){
     70             G.vexlist[p->adjvex].inDegree++;
     71             //G.vexlist[i].firstedge->num++;
     72             p = p->nextedge;
     73         }
     74     }
     75     for (int i = 1; i < G.vexnum + 1; i++){
     76         if(G.vexlist[i].inDegree == 0){
     77             S.push(i);
     78         }
     79     }
     80     while (S.top != -1){
     81         int j = S.pop();
     82         //cnt++;
     83         p = G.vexlist[j].firstedge;
     84         while (p){
     85             G.vexlist[p->adjvex].inDegree--;
     86           //  G.vexlist[j].firstedge->num--;
     87             if (G.vexlist[p->adjvex].inDegree == 0 && p->nextedge == NULL){
     88                 S.push(p->adjvex);
     89                 cnt++;
     90             }
     91 
     92             p = p->nextedge;
     93         }
     94     }
     95     return cnt;
     96 }
     97 vexList G;
     98 int main(){
     99     int n, m;
    100     int cnt = 0;
    101     scanf("%d %d", &n, &m);
    102     GraphList(G, n, m);
    103     cnt = Tsort(G);
    104     printf("%d", Tsort(G));
    105     return 0;
    106 }
  • 相关阅读:
    day 1 python全栈学习笔记(不完全版)
    python全栈学习之旅正式开始了!
    [Web] Web开发中你可以借鉴的东西
    Google Guice 系列教程 - 基础实践
    Ant
    [Android]Android高级UI开发系列教程(一) Android拖拽教程
    [Android]Android高级UI开发系列教程(二) Android绘制教程
    [Android] 布局基础知识点
    BitbucketGit
    [Android]Android高级UI开发系列教程(三) Android样式和主题教程
  • 原文地址:https://www.cnblogs.com/cnblogsnearby/p/4574786.html
Copyright © 2020-2023  润新知