Ejemplo n.º 1
0
        public void TestUndirectedGraph()
        {
            IVertexList <Vertex> vertices = new VertexList <Vertex>();
            IUndirectedAdjacencyList <int, Vertex, Edge <Vertex> > edges = new UndirectedAdjacencyList <int, Vertex, Edge <Vertex> >();
            IUndirectedGraph <IVertexList <Vertex>, int, Vertex, IUndirectedAdjacencyList <int, Vertex, Edge <Vertex> >, Edge <Vertex> > graph = new UndirectedGraph <IVertexList <Vertex>, int, Vertex, IUndirectedAdjacencyList <int, Vertex, Edge <Vertex> >, Edge <Vertex> >(vertices, edges);

            Assert.IsNotNull(graph.EdgeSet);
            Assert.IsNotNull(graph.VertexSet);
            Assert.IsNotNull(((IMutableGraph <VertexList <Vertex>, int, Vertex, IUndirectedAdjacencyList <int, Vertex, Edge <Vertex> >, Edge <Vertex> >)graph).EdgeSet);
            Assert.IsNotNull(((IMutableGraph <VertexList <Vertex>, int, Vertex, IUndirectedAdjacencyList <int, Vertex, Edge <Vertex> >, Edge <Vertex> >)graph).VertexSet);
            Assert.IsNotNull(((IReadonlyGraph <VertexList <Vertex>, int, Vertex, IUndirectedAdjacencyList <int, Vertex, Edge <Vertex> >, Edge <Vertex> >)graph).EdgeSet);
            Assert.IsNotNull(((IReadonlyGraph <VertexList <Vertex>, int, Vertex, IUndirectedAdjacencyList <int, Vertex, Edge <Vertex> >, Edge <Vertex> >)graph).VertexSet);
        }
        public static AdjacencyList ReadGraph(string filepath)
        {
            StreamReader reader = new StreamReader(filepath);

            int  no_of_node = -1;
            int  no_of_edge = -1;
            bool directed   = false;

            while (!reader.EndOfStream)
            {
                string[] record = reader.ReadLine().Split(' ');

                // 1フィールド目が属性
                switch (record[0])
                {
                case "TYPE":
                    directed = record[2] == "DIRECTED";
                    break;

                case "NO_OF_NODE":
                    no_of_node = int.Parse(record[2]);
                    break;

                case "NO_OF_EDGE":
                    no_of_edge = int.Parse(record[2]);
                    break;

                case "EDGE_CODE_SECTION":
                    goto READ_EDGE_DATA;
                }
            }
            // エッジデータの読み込み
READ_EDGE_DATA:
            if (no_of_node == -1)
            {
                Common.ErrorExit("ノード数の指定がありません。");
            }
            if (no_of_edge == -1)
            {
                Common.ErrorExit("エッジ数の指定がありません。");
            }

            int[][] edge_list = new int[no_of_edge][];
            for (int i = 0; i < no_of_edge; i++)
            {
                if (reader.EndOfStream)
                {
                    Common.ErrorExit("NO_OF_EDGEで指定されたエッジ数よりも少ないデータが記載されています。");
                }
                string[] record = reader.ReadLine().Split(' ');
                edge_list[i]    = new int[2];
                edge_list[i][0] = int.Parse(record[0]);
                edge_list[i][1] = int.Parse(record[1]);
            }

            if (!reader.EndOfStream)
            {
                Common.ErrorExit("NO_OF_EDGEで指定されたエッジ数よりも多いデータが記載されています。");
            }

            AdjacencyList instance;

            if (directed)
            {
                instance = new DirectedAdjacencyList(no_of_node, no_of_edge, edge_list);
            }
            else
            {
                instance = new UndirectedAdjacencyList(no_of_node, no_of_edge, edge_list);
            }
            return(instance);
        }