Провести для всех вершин графа обход в глубину - C#

Узнай цену своей работы

Формулировка задачи:

Помогите! Необходимо провести для всех вершин графа обход в глубину вот сам граф 1 2 5 3 4

Решение задачи: «Провести для всех вершин графа обход в глубину»

textual
Листинг программы
using System;
 
// Что стоит почитать по теме:
//http://en.wikipedia.org/wiki/Depth-first_search
//http://www.cse.ohio-state.edu/~gurari/course/cis680/cis680Ch14.html
//http://www.algolist.net/Algorithms/Graph/Undirected/Depth-first_search#cormen_book
//Book: Data Structures and Algorithms in Java by Robert Lafore (Author)
//"Java to C# converter" Copyright © 2007 - 2012 Tangible Software Solutions Inc.
 
namespace GraphInDepth
{
 
 
    class Program
    {
      
// Дальше в комментариях  материалы с разных сайтов 
# region Usefull_Source
   
  //     Visit(v);
     //     Mark(v);
     // for каждого ребра vw графа G do
     //  if вершина w непомечена 
     //      DepthFirstTraversal(G,w);
     //   end if; 
     //end for;
      
 
 
 
////            Обход графов в глубину
////    На этом шаге мы рассмотрим алгоритм обхода графа в глубину. 
 
////    Обход в глубину (называемый иногда стандартным обходом), есть обход графа по следующим правилам:
 
////находясь в вершине x, нужно двигаться в любую другую, ранее не посещенную вершину (если таковая найдется), одновременно запоминая дугу, 
//            по которой мы впервые попали в данную вершину;
////если из вершины x мы не можем попасть в ранее не посещенную вершину или таковой вообще нет, то мы возвращаемся в вершину z,
//            из которой впервые попали в x, и продолжаем обход в глубину из вершины z.
////    При выполнении обхода графа по этим правилам мы стремимся проникнуть "вглубь" графа так далеко, как это возможно,
//            затем отступаем на шаг назад и снова стремимся пройти вперед и так далее.
 
////    На этом шаге мы приведем рекурсивную функцию обхода графа в глубину. Граф представлен в памяти структурой Вирта.
 
 
            // В приведенной ниже формулировке нерекурсивного алгоритма поиска в глубину на графе [1,с.125-126] предполагается: 
            //во-первых, что зафиксирован некоторый линейный порядок на множестве всех вершин графа, и, во-вторых, что множество вершин, 
            //смежных со всякой вершиной графа, также линейно упорядочено.
 
            //while (Имеется хотя бы одна непосещенная вершина)
            //{
            //  Пусть p - первая из непосещенных вершин.
            //  Посетить вершину p и поместить ее в пустой стек S;
            //  while ( Стек S непуст )
            //  {
            //    Пусть p - вершина, находящаяся на верхушке стека S;
            //    if (У вершины p есть непосещенные смежные вершины)
            //      { Пусть q - первая непосещенная вершина из вершин, смежных 
            //        вершине p. Пройти по ребру (p,q), посетить вершину q и 
            //        поместить ее в стек S } 
            //    else Удалить вершину p из стека S
            //  }
            //}
 
 
 
#endregion
      
public class StackX
{
private readonly int SIZE = 20;
private int[] st;
private int top;
public StackX() // constructor
{
st = new int[SIZE]; // make array
top = -1;
}
public virtual void push(int j) // put item on stack
{
    st[++top] = j;
}
public virtual int pop() // take item off stack
{
    return st[top--];
}
public virtual int peek() // peek at top of stack
{
    return st[top];
}
public virtual bool Empty
{
    get
    {
        return (top == -1);
    }
}
} // end class StackX
////////////////////////////////////////////////////////////////
 
        
public class Vertex
{
public char label; // label (e.g. 'A')
public bool wasVisited;
// ------------------
public Vertex(char lab) // constructor
{
label = lab;
wasVisited = false;
}
// ------------------
} // end class Vertex
////////////////////////////////////////////////////////////////
 
               
public class Graph
{
private readonly int MAX_VERTS = 20;
private Vertex[] vertexList; // list of vertices
private int[][] adjMat; // adjacency matrix
private int nVerts; // current number of vertices
private StackX theStack;
// ------------------
public Graph() // constructor
{
vertexList = new Vertex[MAX_VERTS];
// adjacency matrix
//ORIGINAL LINE: adjMat = new int[MAX_VERTS][MAX_VERTS];
//JAVA TO C# CONVERTER NOTE: The following call to the 'RectangularArrays' helper class reproduces the rectangular array initialization that is automatic in Java:
adjMat = RectangularArrays.ReturnRectangularIntArray(MAX_VERTS, MAX_VERTS);
nVerts = 0;
for (int j = 0; j < MAX_VERTS; j++) // set adjacency
{
for (int k = 0; k < MAX_VERTS; k++) // matrix to 0
{
adjMat[j][k] = 0;
}
}
theStack = new StackX();
} // end constructor
// ------------------
public virtual void addVertex(char lab)
{
vertexList[nVerts++] = new Vertex(lab);
}
// ------------------
public virtual void addEdge(int start, int end)
{
adjMat[start][end] = 1;
adjMat[end][start] = 1;
}
// ------------------
public virtual void displayVertex(int v)
{
Console.Write(vertexList[v].label);
}
// ------------------
public virtual void dfs() // depth-first search
{ // begin at vertex 0
vertexList[0].wasVisited = true; // mark it
displayVertex(0); // display it
theStack.push(0); // push it
while (!theStack.Empty) // until stack empty,
{
// get an unvisited vertex adjacent to stack top
int v = getAdjUnvisitedVertex(theStack.peek());
if (v == -1) // if no such vertex,
{
theStack.pop();
}
else // if it exists,
{
vertexList[v].wasVisited = true; // mark it
displayVertex(v); // display it
theStack.push(v); // push it
}
} // end while
// stack is empty, so we're done
for (int j = 0; j < nVerts; j++) // reset flags
{
vertexList[j].wasVisited = false;
}
} // end dfs
// ------------------
// returns an unvisited vertex adj to v
public virtual int getAdjUnvisitedVertex(int v)
{
for (int j = 0; j < nVerts; j++)
{
if (adjMat[v][j] == 1 && vertexList[j].wasVisited == false)
{
return j;
}
}
return -1;
} // end getAdjUnvisitedVert()
// ------------------
 
} // end class Graph
////////////////////////////////////////////////////////////////
 
 
//----------------------------------------------------------------------------------------
//  Copyright © 2007 - 2012 Tangible Software Solutions Inc.
//  This class can be used by anyone provided that the copyright notice remains intact.
//
//  This class provides the logic to simulate Java rectangular arrays, which are jagged
//  arrays with inner arrays of the same length.
//----------------------------------------------------------------------------------------
 
internal static partial class RectangularArrays
{
    internal static int[][] ReturnRectangularIntArray(int Size1, int Size2)
    {
        int[][] Array = new int[Size1][];
        for (int Array1 = 0; Array1 < Size1; Array1++)
        {
            Array[Array1] = new int[Size2];
        }
        return Array;
    }
}
 
public static void Main(string[] args)
{
Graph theGraph = new Graph();
theGraph.addVertex('1'); // 0 (start for dfs)
theGraph.addVertex('2'); // 1
theGraph.addVertex('3'); // 2
theGraph.addVertex('4'); // 3
theGraph.addVertex('5'); // 4
theGraph.addEdge(0, 1); // 1-2
theGraph.addEdge(1, 4); // 2-5
theGraph.addEdge(4, 2); // 5-3
theGraph.addEdge(2, 3); // 3-4
Console.Write("Visits: ");
theGraph.dfs(); // depth-first search
Console.WriteLine();
    Console.ReadKey();
} // end main()
 
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы