无向图计算最短路径:
通过建立二维数组来表示两点之间是否可达,通过寻找连通分量,每次找到过一个点就将点放入到list集合中,并且当前连通量的个数减去一个,每次寻找的点都必须是到达list中最短的,并且当前连通量的个数减去一个,当连通量等于1的时候,那么list中的各个点的路径就是无向图的最短路径。
//无向图最小生成树
public class Prim {
public static void main(String[] args) {
Prim p = new Prim();
//记录连通量的个数
int size = 6;
//记录当前最大连通量的所含字母
List<Integer> list = new ArrayList<>();
//画出无向图并标明边权
int[][] arr = {
{0,0,0,0,0,0,0},
{0,-1,6,1,5,-1,-1},
{0,6,-1,5,-1,3,-1},
{0,1,5,-1,5,6,4},
{0,5,-1,5,-1,-1,2},
{0,-1,3,6,-1,-1,6},
{0,-1,-1,4,2,6,-1}
};
int result = p.getAnswer(size,list,arr);
System.out.println("最短连通长度为:"+result);
}
private int getAnswer(int size, List<Integer> list, int[][] arr) {
int answer = 0;
int curLength = Integer.MAX_VALUE;
int index1 = 0;
int index2 = 0;
//判断当前连通分量的数量
while(size > 1) {
for (int i = 1; i < arr.length; i++) {
//如果set 包含了当前连通量 跳到下一行
if(list.contains(i)) {
continue;
}
for (int j = 1; j < arr[i].length; j++) {
//说明两点之间不可达
if(arr[i][j] < 0) {
continue;
}
//list为空的时候代表第一次找最小权值
//list不为空代表 需要找到与当前最大连通分量有连接的最小边权
if((list.size() == 0 || list.contains(j)) && arr[i][j] < curLength){
curLength = arr[i][j];
index1 = i;
index2 = j;
}
}
}
list.add(index1);
list.add(index2);
size--;
answer += curLength;
curLength = Integer.MAX_VALUE;
}
return answer;
}
}