static void Main(string[] args) { char[] data = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' }; int verxs = data.Length; int[,] weight = new int[, ]//10000表示不连通 { { 10000, 5, 7, 10000, 10000, 10000, 2 }, { 5, 10000, 10000, 9, 10000, 10000, 3 }, { 7, 10000, 10000, 10000, 8, 10000, 10000 }, { 10000, 9, 10000, 10000, 10000, 4, 10000 }, { 10000, 10000, 8, 10000, 10000, 5, 4 }, { 10000, 10000, 10000, 4, 5, 10000, 6 }, { 2, 3, 10000, 10000, 4, 6, 10000 } }; GraphMap graph = new GraphMap(verxs); MinTree minTree = new MinTree(); minTree.CreateGraph(graph, verxs, data, weight); minTree.ShowGraph(graph); Console.WriteLine(); Console.WriteLine("普利姆算法"); minTree.Prim(graph, 0); Console.ReadKey(); }
//prim核心算法 //v表示从图的第几个顶点开始 public void Prim(GraphMap graph, int v) { int[] visited = new int[graph.Verxs]; //标记顶点是否被访问过 visited[v] = 1; //标记当前顶点为访问过 for (int k = 1; k < graph.Verxs; k++) //普利姆算法结束后,有n-1条边 { int h1 = -1, h2 = -1; //h1 h2 记录两个顶点的下标 int minWeight = 10000; //记录边的最小权值 for (int i = 0; i < graph.Verxs; i++) { for (int j = 0; j < graph.Verxs; j++) { if (visited[i] == 1 && visited[j] == 0 && graph.Weight[i, j] < minWeight) { minWeight = graph.Weight[i, j]; //记录最小边的权值 h1 = i; //记录最小边的顶点下标 h2 = j; } } } //找权值最小的边了 Console.WriteLine(string.Format("边<{0},{1}>\t权值为{2}", graph.Data[h1], graph.Data[h2], minWeight)); //将当前访问过的顶点标记为访问过 visited[h2] = 1; } }
public void ShowGraph(GraphMap graph) { for (int i = 0; i < graph.Verxs; i++) { for (int j = 0; j < graph.Verxs; j++) { Console.Write(graph.Weight[i, j] + "\t"); } Console.WriteLine(); } }
public void CreateGraph(GraphMap graph, int verxs, char[] data, int[,] weight) { for (int i = 0; i < verxs; i++) { graph.Data[i] = data[i]; for (int j = 0; j < verxs; j++) { graph.Weight[i, j] = weight[i, j]; } } }