public class prim2
{
public static int INF = 32767, maxVertexNum = 100;
public class MGraph
{
public string[] vertex = new string[maxVertexNum];
public int[,] edges = new int[maxVertexNum, maxVertexNum];
public int n, e;
}
public void CreateMGraph(MGraph G)
{
int i, j;
//Console.WriteLine("请输入顶点数和边数:");
G.n = 5;
G.e = 7;
Console.WriteLine("请输入顶点元素:");
for (i = 0; i < G.n; i++)
{
G.vertex[i] = i.ToString ();
}
for (i = 0; i < G.n; i++)
{
for (j = 0; j < G.n; j++)
{
G.edges[i,j] = INF; //初始化无限大权值
if (i == j)
{
G.edges[i,j] = 0; //对角线为0
}
}
}
G.edges[0, 1] = 60;
G.edges[1, 0] = 60;
G.edges[0, 3] = 20;
G.edges[3, 0] = 20;
G.edges[0, 2] = 100;
G.edges[2, 0] = 100;
G.edges[1, 2] = 80;
G.edges[2, 1] = 80;
G.edges[1, 3] = 95;
G.edges[3, 1] = 95;
G.edges[2, 4] = 70;
G.edges[4, 2] = 70;
G.edges[3, 4] = 10;
G.edges[4, 3] = 10;
}
public int MinEdge(int []lowcost,int n)
{
int i, k=0 , min = INF;
for (i = 0; i < n; i++)
{
if (lowcost[i] < min && lowcost[i] != 0)
{
min = lowcost[i];
k = i;
}
}
return k;
}
public void prim(MGraph G, int[] lowcost, int [] adjvex)
{
int i,j,k;
for(i=1;i<G.n;i++) //初始化两个辅助数组
{
lowcost[i]=G.edges[0,i];
adjvex[i]=0;
}
lowcost[0]=0; //将顶点0加入集合U中
for (i=1;i<G.n;i++)
{
k=MinEdge(lowcost,G.n);
Console .WriteLine ( "{0},{1},{2}" , adjvex[k] , k , lowcost[k]) ;
lowcost[k]=0;
for (j=0;j<G.n;j++) //跟书上的不一样,这里j要从0开始,调整数组lowcost和adjvex
{
if (G.edges[k,j]<lowcost[j] && G.edges[k,j]!=0)
{
lowcost[j]=G.edges[k,j];
adjvex[j]=k;
}
}
}
}
static void Main(string[] args)
{
//prim p = new prim();
//prim.graph g = new prim.graph();
//p.prim1(g);
prim2 p = new prim2();
prim2.MGraph g = new prim2.MGraph();
int []lowcost=new int [25];
int [] adjvex=new int[25];
p.CreateMGraph(g);
p.prim(g, lowcost, adjvex);
Console.Read();
}