我有两个阵列
string[] city = {"A","B","C","D"}
连接它们的成本说
int[] cost ={ 2,1,3,2,4,3}
任务是在这里找到最短的路径成本。
为什么?
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 +其他人中引用了一些问题,但却无法理解。
如果没有任何第三部分图书馆的帮助怎么做?请提供一个简单的方法!
我的尝试(不太正确)
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);
提前致谢。
答案 0 :(得分: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
答案 1 :(得分:0)
您可以重新定义类似这样的节点
A B C D
A - 2 1 3
B 2 - 2 4
C 1 2 - 3
D 3 4 3 -
然后遍历这个2d数组以运行所有组合。以2d数组保存数据可能会简化您需要了解成本的方式。
当你说
时A->B = 2
A->C = 1
A->D = 3
--------- = 6 (cheapest)
实际上你是从A开始,然后是B,然后是C,最后是D。
[现在完全空白,可以给你一些示例代码来运行它。请原谅我]
答案 2 :(得分:0)
正如我在上面的评论中所说,能够了解EXACT值的唯一方法是通过所有组合。
在图论的大学里我做过类似的事情
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]
...
您为每个解决方案分配正确的重量并选择最短的重量。