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;
}
}