C#中的简单图形表示

时间:2016-03-09 15:37:49

标签: c# graph

我是C#编程的新手,我正在尝试使用adgecency list方法实现图形ADT。这是我对图表的表示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Graph
{
    class Program
    {
        public class Graph
        {
            private int V;
            private int E;
            private List<List<int>> adj = new List<List<int>>();

            public Graph(int V0)
            {
                V = V0;
                E = 0;
                for(int v = 0; v < V0; v++)
                adj[v] = new List<int>();
            }

            public int getV() { return V; }
            public int getE() { return E; }

            public void addEdge(int v, int w)
            {
                adj[v].Add(w);   // Add w to v`s list
                adj[w].Add(v);   // add v to w`s list
                E++;
            }

            public string toStr()
            {
                string s = V.ToString() + "vertices, " + E.ToString() + "edges\n";
                for (int v = 0; v < V; v++ )
                {
                    s += v + ":";
                    foreach(int w in this.adj[v])
                        s += w.ToString() + " ";
                    s += '\n';
                }
                    return s;
            }


        }

        static void Main()
        {
            Graph g = new Graph(4);
            g.addEdge(0, 1);
            g.addEdge(0, 2);
            g.addEdge(0, 3);
            g.addEdge(1, 2);
            g.addEdge(2, 3);

            Console.WriteLine(g.toStr());

        }
    }
}

但是当我编译它时,编译器表示这行代码:

 adj[v] = new List<int>();

并抛出一个System.ArgumentOutOfRangeException。 如果有人有任何想法我的代码有什么问题我会很感激。

2 个答案:

答案 0 :(得分:2)

您需要添加子列表,因为此时adj为空。

for(int v = 0; v < V0; v++)
    adj.Add(new List<int>());

答案 1 :(得分:1)

adj[v] = new List<int>();中,你试图将元素设置在v位置。但adj最初为空,您收到此异常,因为位置“v”无效。

相反,您可以添加新列表:

for(int v = 0; v < V0; v++)
    adj.Add(new List<int>())

或者如果您愿意,可以将adj更改为数组类型并使用索引版本:

private List<int>[] adj;
...

public Graph(int V0)
{
    V = V0;
    E = 0;

    adj = new List<int>[V0];
    for(int v = 0; v < V0; v++)    
        adj[v] = new List<int>();
}