1

我有两个数组

string[] city = {"A","B","C","D"}

连接它们的成本说

int[] cost ={ 2,1,3,2,4,3}

任务是找到最短路径成本,此处为 6。

为什么?

A->B = 2
A->C = 1
A->D = 3
--------- = 6 (cheapest)

B->C = 2
B->D = 4
B->A = 2
-------- = 8

C->D = 3
C->A = 1
C->B = 2
------------ = 6 (cheapest)

D->A =3
D->B = 4
D->C = 3
------------- = 10

依此类推..总共会出现 16(2^4) 个这样的组合。

我在 SO + others 中引用了一些问题,但无法理解。

如何在不借助任何第三方库的情况下做到这一点?请提供一种简单的方法!

我的尝试(不是很正确)

public static int minimum_cost(string[] input1, int[] input2)
{
    int i = 0;
    int j = 0;
    int k = 0;
    int counter = 0;
    int len = input2.Length;
    var storage = new int[input1.Length * input2.Length];

    for (i = 0; i < len - 2; i++)
    {
        for (j = i + 1; j < len - 1; j++)
        {
            for (k = j + 1; k < len; k++)
            {
                var m1 = input2[i];
                var m2 = input2[j];
                var m3 = input2[k];

                storage.SetValue(m1 + m2 + m3, counter);                     
                counter++;
            }                   
        }              
    }
    return storage.Take(counter).Min();
}

调用

var input1 = new string[] { "A", "B", "C", "D" };
var input2 = new int[] { 2, 3, 1, 2, 4, 3 };
var res = minimum_cost(input1, input2); 

在此处输入图像描述

提前致谢。

4

3 回答 3

1

city首先,在和之间创建一个映射cost,这样我们就可以轻松访问每条边的成本:

string[] city = {"A","B","C","D"};
int[] cost = {2,1,3,2,4,3};

var mappings = new List<Tuple<string, string, int>>();

var cs = new Queue<string>(city);
var e = cost.GetEnumerator();
while(cs.Any())
{
    var c = cs.Dequeue();
    foreach (var o in cs)
    {
        e.MoveNext();
        mappings.Add(Tuple.Create(c, o, (int)e.Current));
    }
}

mappings现在看起来像

在此处输入图像描述

现在我们有了合适的数据结构,找到路径成本就很简单了:

var result = from c in city
             select new { c, cost = mappings.Where(m => m.Item1 == c || m.Item2 == c).Sum(m => m.Item3) };

在此处输入图像描述

var shortest = result.Min(a => a.cost); // 6
于 2013-05-10T12:21:57.343 回答
0

您可以像这样重新定义节点

    A   B   C   D
A   -   2   1   3
B   2   -   2   4
C   1   2   -   3
D   3   4   3   -

然后遍历这个二维数组来遍历所有组合。将数据保存在二维数组中可能会简化您需要了解成本的方式。

当你说

A->B = 2
A->C = 1
A->D = 3
--------- = 6 (cheapest)

实际上是你从 A 开始,到 B,然后是 C,最后到 D。

[现在完全空白,本可以给你一些示例代码来运行它。请原谅我]

于 2013-05-10T11:55:01.753 回答
0

正如我在上面的评论中所说,能够知道确切值的唯一方法是通过所有组合。

在图论的大学里,我做了这样的事情

   A   B   C   D
A  -   2   3   1

B  2   -   2   4

C  3   2   -   3   

D  1   4   3   -

现在你只需要计算我喜欢这样做的所有可能性

[A B C D]
[A B D C]
[A C B D]
...

您为每个解决方案分配正确的权重并选择最短的一个。

于 2013-05-10T11:58:11.870 回答