C#/수업 내용

[C#] Graph DFS

JSH1 2021. 10. 4. 01:12

            var graph = new Graph();

            var seoul = graph.AddVertex("서울");
            var gangneung = graph.AddVertex("강릉");
            var daejeon = graph.AddVertex("대전");
            var daegu = graph.AddVertex("대구");
            var busan = graph.AddVertex("부산");

            graph.AddEdge(seoul, gangneung, 10);
            graph.AddEdge(seoul, daegu, 7);
            graph.AddEdge(seoul, daejeon, 6);

            graph.AddEdge(daejeon, busan, 7);

            graph.AddEdge(daegu, busan, 3);
            graph.AddEdge(daegu, gangneung, 4);

            graph.DFS("서울");
    class Graph
    {
        public class Vertex
        {
            public string Data { get; private set; }
            public LinkedList<Vertex> neighbors;
            public LinkedList<int> weights;

            public Vertex(string data)
            {
                neighbors = new LinkedList<Vertex>();
                weights = new LinkedList<int>();
                Data = data;
            }
        }

        private List<Vertex> vertexes;
        private HashSet<String> set;

        public Graph()
        {
            vertexes = new List<Vertex>();
            set = new HashSet<string>();
        }

        private void DFSRecursive(Vertex vertex)
        {
            Console.Write("{0} ", vertex.Data);
            set.Add(vertex.Data);

            foreach (var neighbor in vertex.neighbors)
            {
                if (!set.Contains(neighbor.Data))
                {
                    DFSRecursive(neighbor);
                }
            }
        }

        public void DFS(string data)
        {
            set.Clear();

            set.Add(data);

            foreach(var vertex in vertexes)
            {
                if(vertex.Data == data)
                {
                    for(int i=0; i< vertex.neighbors.Count;i++)
                    {
                        if (!set.Contains(vertex.neighbors.ElementAt(i).Data))
                        {
                            Console.Write("{0} ", data);
                            DFSRecursive(vertex.neighbors.ElementAt(i));
                        }
                    }
                }
            }
        }

        public void Print()
        {
            foreach (Vertex vertex in vertexes)
            {
                for (int i = 0; i < vertex.neighbors.Count; i++)
                {
                    var v = vertex.neighbors.ElementAt(i);
                    var w = vertex.weights.ElementAt(i);

                    Console.WriteLine("{0} - {1} - {2}", vertex.Data, w, v.Data);
                }
            }
        }

        public void AddEdge(Vertex from, Vertex to, int weight)
        {
            from.neighbors.AddLast(to);
            to.neighbors.AddLast(from);
            from.weights.AddLast(weight);
            to.weights.AddLast(weight);
        }

        public Vertex AddVertex(string data)
        {
            var vertex = new Vertex(data);
            vertexes.Add(vertex);
            return vertex;
        }
    }