【问题标题】:how to can create graph in c# for dijkstra algorithm?如何在 c# 中为 dijkstra 算法创建图形?
【发布时间】:2017-01-08 07:06:21
【问题描述】:

我正在编写 dijkstra 算法,我想为每个节点创建邻居列表我正在编写一些代码,但我的代码没有为每个节点创建邻居列表。 它有一个问题,即每个节点的邻居都不同,这就是为什么要为每个节点保留完整的邻居列表。

例如:Node[id] ==>(邻居,权重)

Node[0] ==> (1,123)
Node[0] ==> (2,113)
Node[0] ==> (3,214)
Node[0] ==> (4,203)

Node[1] ==> (2,175)
Node[1] ==> (4,214)


    public class Graph
{
    public Dictionary<int, List<KeyValuePair<int, int>>> vertices = new Dictionary<int, List<KeyValuePair<int, int>>>();

    public void AddVertex(int id, List<KeyValuePair<int, int>> edges)
    {
        vertices[id] = edges;
    }
}

    private Graph g = new Graph();

    public int Id { get; set; }
    private List<KeyValuePair<int, int>> dic = new List<KeyValuePair<int, int>>();

    private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button != MouseButtons.Right)
        {
            var result = circleManager.HitTest(e.Location);
            if (result != -1)
            {
                circlesSourceAndDestination.Add(circleManager.Circles[result]);

                if (Count == 1)
                {
                    Id = result;
                }
                else if (Count == 2)
                {
                    var weigth = CalculateLengthSourceAndDestination(circlesSourceAndDestination);
                    circlesSourceAndDestination.Clear();
                    if (weigth < 0)
                    {
                        weigth *= -1;
                    }

                    dic.Add(new KeyValuePair<int, int>(result, weigth));
                    g.AddVertex(Id, dic);
                    //neighborList.Add(new KeyValuePair<int, int>(result, weigth));
                    //newNode.Neighbors = neighborList;

                    //graph.Add(newNode);

                    Count = 0;
                }
                Count++;
            }
        }
        else
        {
            var result = circleManager.HitTest(e.Location);
            if (result != -1)
            {
                circleManager.Circles[circleManager.HitTest(e.Location)].Selected = true;
                circleManager.Circles[result].SelectFillColor = Color.Red;
            }
        }
        pictureBox1.Invalidate();
    }

【问题讨论】:

  • 您能否再详细说明一下出了什么问题。您的代码很好并且相对可读,但很难理解实际出了什么问题。

标签: c# winforms list dictionary


【解决方案1】:

dic 字段在每次迭代期间都会更新。这就是为什么所有顶点都有相同的邻居。您需要重构代码并创建一个新的邻居列表。

public class Graph
{
    public Dictionary<int, List<KeyValuePair<int, int>>> vertices = new Dictionary<int, List<KeyValuePair<int, int>>>();

    public void AddVertex(int id, List<KeyValuePair<int, int>> edges)
    {
        if(!vertices.ContainsKey(id))
        {
              vertices.Add(id, new List<KeyValuePair<int, int>>());
        }
        vertices[id].AddRange(edges);
    }
}

public int Id { get; set; }

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button != MouseButtons.Right)
    {
        var result = circleManager.HitTest(e.Location);
        if (result != -1)
        {
            circlesSourceAndDestination.Add(circleManager.Circles[result]);

            if (Count == 1)
            {
                Id = result;
            }
            else if (Count == 2)
            {
                var weigth = CalculateLengthSourceAndDestination(circlesSourceAndDestination);
                circlesSourceAndDestination.Clear();
                if (weigth < 0)
                {
                    weigth *= -1;
                }
                var neighbor = new KeyValuePair<int, int>(result, weigth);
                var list = new List<KeyValuePair<int, int>> { neighbor };
                g.AddVertex(Id, list);


                Count = 0;
            }
            Count++;
        }
    }
    else
    {
        var result = circleManager.HitTest(e.Location);
        if (result != -1)
        {
            circleManager.Circles[circleManager.HitTest(e.Location)].Selected = true;
            circleManager.Circles[result].SelectFillColor = Color.Red;
        }
    }
    pictureBox1.Invalidate();
}

你明白了...(我无法测试此代码)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多