2013-05-10 118 views
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 +中的其他一些问题,但无法理解。

如何做到这一点,而不需要任何第三方图书馆的帮助?请提供一个简单的方法来做到这一点!

我尝试(不是很正确)

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); 

enter image description here

在此先感谢。

+1

您的代码并没有太大的意义没有上下文。例如,您的6个整数成本代表哪些连接?我理解你的目标是一个所有节点都连接的图表吗? – 2013-05-10 11:46:43

+0

您的示例输出不显示最短路径,而是最中心的城市。最短的路径将依次通过所有城市,因此不会出现“A-> B,A-> C,A-> D”,而是“A-> B,B-> C,C-> D”。 – 2013-05-10 11:47:53

+0

@ Dan Puzey,是的,先生...你可以假设他们连接在图中... – 2013-05-10 11:47:55

回答

1

首先,创建citycost之间的映射,所以我们可以很容易地访问每个边的成本:

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现在看起来像

enter image description here

现在,我们有一个适当的数据结构,寻找路径成本微不足道:

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

enter image description here

var shortest = result.Min(a => a.cost); // 6 
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上结束了

[全白了,本可以给你一些示例代码来贯穿它。请原谅我]

0

正如我在上面的commet中所说的,唯一能够知道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] 
... 

可以为每个解决方案正确体重并挑选最短的一个。