1 static void Main(string[] args) 2 { 3 double[,] path = getpath(10);//随机生成10个点之间的距离矩阵 4 Dictionary<int, double> result = getr(path);//result<点,距离> 5 6 } 7 public static Dictionary<int, double> getr(double[,] da) 8 { 9 Dictionary<int, double> result = new Dictionary<int, double>(); 10 result.Add(0, 0); //默认添加首点 11 int n =Convert.ToInt32(Math.Sqrt(da.Length)); 12 double[] minlen =new double[n];//存储每次找到的最近点距离其它点的距离 13 int[] visit =new int[n]; //一共0到9点 计算过后的点为1 14 for(int i=0;i<n;i++){ 15 minlen[i] = da[0, i];//初始化首点与其它点距离 16 } 17 visit[0] = 1; //默认第一点为原点,已经添加到visit集合 18 int minj = 0; //遍历循环默认第一点最小 19 for (int i = 0; i < n; i++) { 20 double min = double.PositiveInfinity; 21 for (int j =0; j < n ; j++) { 22 if (visit[j] == 0 && minlen[j] < min) {//遍历minlen 找到最小 23 min = minlen[j];//j循环最小值 24 minj = j; //第minj最小 25 } 26 } 27 if (min == double.PositiveInfinity) return result;//测试数据有可能出现x点到其它点没有距离 28 visit[minj] = 1; //第minj点已添加 29 result.Add(minj,min); 30 for (int j = 0; j < n ; j++)//重新计算minlen 31 { 32 if (visit[j] == 0 && minlen[minj] !=double.PositiveInfinity 33 && da[minj,j] != double.PositiveInfinity 34 && minlen[j] > (minlen[minj] + da[minj,j])) 35 { 36 minlen[j] = minlen[minj] + da[minj,j]; 37 } 38 } 39 } 40 return result; 41 } 42 public static double[,] getpath(int num) { 43 Random rd=new Random(); 44 double[,] path = new double[num, num]; 45 for (int i = 0; i < num; i++) 46 { 47 for (int j = 0; j < num; j++) 48 { 49 path[i, j] = rd.Next(1,100);//生成测试数据 50 if (path[i, j] > 60 || i == j) path[i, j] = double.PositiveInfinity; 51 } 52 } 53 return path; 54 }
原文:http://www.cnblogs.com/shezhe/p/5075128.html