1

Adjacency List次のコードのように、C#を使用し てグラフを表現しようとしています。しかし、C#でより良い実装を見つけることができる場所を知りたいです。Java用のこのWebサイトのように:http://algs4.cs.princeton.edu/41undirected/Graph.java.html

この実装を改善するために、私はいくつかの質問があります:

  1. 使用する別の単純なデータ構造があり、、、などDFSの操作BFSFind the Shortest-path簡単にすることができますか?または、解決すべき問題に応じてデータ構造が大きく変化しますか?

===編集済み===

以下のようにデータ構造を実装してみました。

OBS:このアプローチは単純に見えますが、たとえば、常に最初の要素を追跡する必要があるため、DFSにはあまり適していないことに後で気付きますLinkedList。私のソリューションでは、カスタムを使用する方が良いようです。の代わりにリンクリストを作成しました LinkedList<Vertex>

以下のコメントを考慮し、単純さを維持するために、いくつかの変更を加えました。しかし、その変更が。のような以降の操作に影響を与えるかどうかはわかりませんBFS。直接および間接のグラフを作成できるようにするには、プロパティよりもインターフェイスを使用する方が良いと思います。

 public interface IGraph
    {
        void InsertEdge(int edgeAKey, int edgeBKey);
        void IsertNewVertex(int vertexKey);
        LinkedList<Vertex> FindByKey(int vertexKey);
        bool ExistKey(int vertexKey);
    }

できるだけ単純にするために、Dictionaryやのようなすでに実装されているデータ構造を使用できますLinkedListobjectまた、 asを使用する代わりに、Dictionary key簡単にするために、別のにすでに存在する値を追加する場合はVertexkey(またはlabel)とを作成できます。valueVertex

public class GraphDirect : IGraph
    {
        private Dictionary<int,LinkedList<Vertex>> Vertexes { get; set; }

        public GraphDirect()
        {
            Vertexes = new Dictionary<int, LinkedList<Vertex>>();
        }

        public bool ExistKey(int vertexKey)
        {
            if (this.FindByKey(vertexKey) == null)
                return false;
            else
                return true;
        }

        public void IsertNewVertex(int vertexKey)
        {
            if (!this.ExistKey(vertexKey))
            {
                Vertex vertex = new Vertex(vertexKey);
                LinkedList<Vertex> listVertexes = new LinkedList<Vertex>();
                listVertexes.AddFirst(vertex);
                this.Vertexes.Add(vertexKey, listVertexes);
            }
        }

        public void InsertEdge(int vertexAKey, int vertexBKey)
        {
            //Create the vertex A, if it doesn't exist            
            if (!this.ExistKey(vertexAKey))
            {
                this.IsertNewVertex(vertexAKey);
            } 
            //Will always insert the vertex B on this edge
            this.FindByKey(vertexAKey).AddLast(new Vertex(vertexBKey));
            //Create the vertex B, if doesn't exist
            if (!this.ExistKey(vertexBKey))
            {
                this.IsertNewVertex(vertexBKey);
            }
        }

        public LinkedList<Vertex> FindByKey(int vertexKey)
        {
            if (this.Vertexes.ContainsKey(vertexKey))
                return this.Vertexes[vertexKey];

            return null;
        }

    }

Vertexクラスは他のポインタを必要とせず、必要に応じてkeyとを保持するだけvalueです。

public enum State { Visited = 0, UnVisited = 1, Processed = 2 }

public class Vertex
{
    public int Key;
    public int Value;
    public State Status = State.UnVisited;

    public Vertex(int key)
    {
        this.Key = key;
        this.Value = 0;
    }

    public Vertex(int key, int value)
    {
        this.Key = key;
        this.Value = value;
    }
}

public class Start
{
     public static void Main(){
         GraphDirect gDirect = new GraphDirect();
         gDirect.InsertEdge(2, 3);
         gDirect.InsertEdge(2, 8);
         gDirect.InsertEdge(5, 6);
     }
}
4

0 に答える 0