package prim;
import java.util.Arrays;
public class primAlgroithm {
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] data = new char[]{'A','B','C','D','E','F','G'};
int verxs = data.length;
int [][]weight=new int[][]{
{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},};
MGraph mGraph = new MGraph(verxs);
MinTree minTree = new MinTree();
minTree.createGraph(mGraph, verxs, data, weight);
minTree.showGraph(mGraph);
//数字代表从data[]的第几位开始遍历
minTree.prim(mGraph, 5);
}
}
class MinTree{
public void createGraph(MGraph graph,int verxs,char [] data, int [][]weight){
int i,j;
for(i =0;i<verxs;i++) {
graph.data[i] = data[i];
for(j=0;j<verxs;j++) {
graph.weight[i][j] = weight[i][j];
}
}
//显示邻接矩阵
}
public void showGraph(MGraph graph) {
for(int [] link:graph.weight) {
System.out.println(Arrays.toString(link));
}
}
//prim算法
public void prim(MGraph graph,int v) {
int visited[] = new int[graph.verxs];
//将此顶点标记为以访问
visited[v] = 1;
//记录两个顶点的坐标
int h1 =-1;
int h2=-1;
int minWeight = 10000;//后面会替换掉
for(int k=1;k<graph.verxs;k++) {//有verxs个顶点就有verxs-1条边
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,寻找已访问过的节点和为访问过的节点的权值的最小边
minWeight =graph.weight[i][j];
h1 = i;
h2 = j;
}
}
}
//找到最小的边
System.out.println("边<"+graph.data[h1]+" "+graph.data[h2]+">"+"权"+minWeight);
//当前节点标记为以访问
visited[h2]=1;
//重新设置minWeight
minWeight =10000;
}
}
}
class MGraph{
int verxs;
char []data;
int [][] weight;
public MGraph(int verxs){
this.verxs = verxs;
data = new char[verxs];
weight = new int [verxs][verxs];
}
}