• C#深度优先遍历结构算法


         N久都没做过关于C#的WinForm程序了,一直都是在研究asp.net的程序。

         今天有个朋友问到深度遍历图这样的问题,开始都不知道如何下手,就问了问baidu 和 google,看到有人用C++写的这样的例子,顺便就学习了一下,发现自己都忘得差不多了(包括:数据结构),只能联想到刚开始学vs2003的时候,学习的第一个Hello Worl的例子,要创建一个控制台应用程序。

         接着就打开VS2005,新建——>项目——>控制台应用程序

      代码如下:

    代码
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Text;
      4 using System.Collections;
      5 
      6 namespace ConsoleApplication2
      7 {
      8     class Program
      9     {
     10         static void Main(string[] args)
     11         {
     12             Graph graph = new Graph();
     13             graph.addVertex('A');
     14             graph.addVertex('B');
     15             graph.addVertex('C');
     16             graph.addVertex('D');
     17             graph.addVertex('E');
     18             graph.addVertex('F');
     19             graph.addVertex('G');
     20             graph.addVertex('H');
     21             graph.addEdge('A''B');
     22             graph.addEdge('B''D');
     23             graph.addEdge('B''E');
     24             graph.addEdge('E''H');
     25             graph.addEdge('D''H');
     26             graph.addEdge('A''C');
     27             graph.addEdge('C''F');
     28             graph.addEdge('F''G');
     29             graph.addEdge('C''G');
     30             Console.Write("深度遍历结果:");
     31             graph.dfs();
     32             Console.WriteLine();
     33         }
     34     }
     35 
     36     class Vertex
     37     {
     38         public Vertex(char label)
     39         {
     40             _label = label;
     41             wasVisited = false;
     42         }
     43 
     44 
     45         public char _label;
     46         public bool wasVisited;
     47     }
     48 
     49     class Graph
     50     {
     51         private static int flag = 1;
     52         private int max_vertexs = 20;//最大顶点数
     53         private Vertex[] vertexList;
     54         private int[,] adjMat;
     55         private int countVertexs;
     56         private Stack thestack;
     57         public Graph()
     58         {
     59             vertexList = new Vertex[max_vertexs];
     60             adjMat = new int[max_vertexs, max_vertexs];
     61             countVertexs = 0;
     62             for (int j = 0; j < max_vertexs; j++)
     63                 for (int k = 0; k < max_vertexs; k++)
     64                     adjMat[j, k] = 0;
     65             thestack = new Stack(max_vertexs);
     66         }
     67         //初始添加点数
     68         public void addVertex(char label)
     69         {
     70             vertexList[countVertexs++= new Vertex(label);
     71         }
     72 
     73         public void addEdge(int start, int end)
     74         {
     75             adjMat[start, end] = 1;
     76             adjMat[end, start] = 1;
     77         }
     78 
     79         public void addEdge(char startV, char endV)
     80         {
     81             int start = -1, end = -1;
     82             for (int i = 0; i < countVertexs; i++)
     83             {
     84                 if (startV == vertexList[i]._label) start = i;
     85                 if (endV == vertexList[i]._label) end = i;
     86             }
     87             if (start == -1) Console.WriteLine("顶点{0}不存在", startV);
     88             if (end == -1) Console.WriteLine("顶点{0}不存在", endV);
     89             //权值默认为1 
     90             adjMat[start, end] = 1;
     91             adjMat[end, start] = 1;
     92         }
     93 
     94         //显示字符
     95         public void displayVertex(int v)
     96         {
     97             if (flag == 1)
     98             {
     99                 Console.Write(vertexList[v]._label);
    100             }
    101             else
    102             {
    103                 Console.Write("," + vertexList[v]._label);
    104             }
    105             flag++;
    106         }
    107         //深度优先遍历
    108         public void dfs()
    109         {
    110             vertexList[0].wasVisited = true;
    111             displayVertex(0);
    112             thestack.Push(0);
    113             //遍历结点
    114             while (thestack.Count!=0)
    115             {
    116                 //从第v个顶点出发递归地深度优先遍历图  (读取栈里的第一个元素,但是不出栈)
    117                 int v = getAdjUnvisitedVertex(Int32.Parse((thestack.Peek().ToString())));
    118                 if (v == -1)
    119                     //元素出栈
    120                     thestack.Pop();
    121                 else
    122                 {
    123                     vertexList[v].wasVisited = true;
    124                     displayVertex(v);
    125                     //元素进栈
    126                     thestack.Push(v);
    127                 }
    128             }
    129             //初始化所有的顶点状态为未被访问
    130             for (int j = 0; j < countVertexs; j++)
    131                 vertexList[j].wasVisited = false;
    132         }
    133 
    134         public int getAdjUnvisitedVertex(int v)
    135         {
    136             for (int j = 0; j < countVertexs; j++)
    137                 if (adjMat[v, j] == 1 && vertexList[j].wasVisited == false)
    138                     return j;
    139             return -1;
    140         }
    141     }
    142 }
    143 

       

        结果如图:

        如果大家有其它好的算法,希望能拿出来分享~

  • 相关阅读:
    【Linux学习七】软件安装
    【Linux学习六】用户管理
    【Linux学习五】文本处理
    【Linux学习四】正则表达式
    【Linux学习三】VI/VIM全屏文本编辑器
    【Linux学习二】文件系统
    【Linux学习一】命令查看与帮助
    【安装虚拟机四】设置快照和克隆
    【安装虚拟机三】设置Linux IP地址
    SpringBoot之定时任务详解
  • 原文地址:https://www.cnblogs.com/ZHF/p/1656006.html
Copyright © 2020-2023  润新知