CShap Prims 源代码
时间: 2023-09-19 11:08:22 浏览: 87
抱歉,我是一名语言模型AI,无法提供源代码。但是,以下是一个C# Prim算法的示例:
```
using System;
using System.Collections.Generic;
class PrimAlgorithm {
private int V;
private List<List<Tuple<int, int>>> adj;
public PrimAlgorithm(int vertex) {
V = vertex;
adj = new List<List<Tuple<int, int>>>(V);
for (int i = 0; i < V; ++i) {
adj.Add(new List<Tuple<int, int>>());
}
}
public void AddEdge(int u, int v, int w) {
adj[u].Add(Tuple.Create(v, w));
adj[v].Add(Tuple.Create(u, w));
}
public void PrimMST() {
bool[] mstSet = new bool[V];
int[] key = new int[V];
int[] parent = new int[V];
for (int i = 0; i < V; ++i) {
key[i] = int.MaxValue;
}
key[0] = 0;
parent[0] = -1;
for (int count = 0; count < V - 1; ++count) {
int u = MinKey(key, mstSet);
mstSet[u] = true;
for (int v = 0; v < V; ++v) {
if (adj[u][v] != null && !mstSet[v] && adj[u][v].Item2 < key[v]) {
parent[v] = u;
key[v] = adj[u][v].Item2;
}
}
}
PrintMST(parent);
}
public int MinKey(int[] key, bool[] mstSet) {
int min = int.MaxValue, minIndex = -1;
for (int v = 0; v < V; ++v) {
if (!mstSet[v] && key[v] < min) {
min = key[v];
minIndex = v;
}
}
return minIndex;
}
public void PrintMST(int[] parent) {
Console.WriteLine("Edge \tWeight");
for (int i = 1; i < V; ++i) {
Console.WriteLine(parent[i] + " - " + i + "\t" + adj[parent[i]][i].Item2);
}
}
}
class Program {
static void Main(string[] args) {
PrimAlgorithm prim = new PrimAlgorithm(5);
prim.AddEdge(0, 1, 2);
prim.AddEdge(0, 3, 6);
prim.AddEdge(1, 2, 3);
prim.AddEdge(1, 3, 8);
prim.AddEdge(1, 4, 5);
prim.AddEdge(2, 4, 7);
prim.AddEdge(3, 4, 9);
prim.PrimMST();
}
}
```
这个算法使用邻接表来表示图,并以数组形式存储每个节点的键值和父节点。在PrimMST方法中,它首先将所有键值初始化为最大值,然后将第一个节点的键值设置为零。接下来,它从未包括在MST中的节点中选择最小键值的节点,并将其添加到MST中。然后,它更新与该节点相邻的所有未包括在MST中的节点的键值和父节点。最后,它打印MST。
阅读全文