最小生成树
最小生成树
题目描述
在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法建立最小生成树,并输出最小生成树的代价。
输入格式
输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。以后的n行中每行有n个用空格隔开的整数,对于第i行的第j个整数,如果不为0,则表示第i个顶点和第j个顶点有直接连接且代价为相应的值,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图,且保证图中只有一个连通分量。
输出格式
只有一个整数,即最小生成树的总代价。请注意行尾输出换行。
样例输入
4
0 2 4 0
2 0 3 5
4 3 0 1
0 5 1 0
样例输出
6
解题思路
使用Prim算法进行计算。
代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
int[][] graph = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
graph[i][j] = scanner.nextInt();
}
}
System.out.println(Main.PrimMST(graph));
}
public static int PrimMST(int[][] graph){
int vertices = graph.length; //顶点数
int[] parents = new int[vertices];//存储MST节点的父节点
int[] dist = new int[vertices]; //存储节点到MST的最小权重
boolean[] isVisited = new boolean[vertices];//记录节点是否加入MST
Arrays.fill(dist, Integer.MAX_VALUE);
dist[0] = 0; //起始节点设为0
parents[0] = -1;//起始节点没有父节点
for(int count=0; count<vertices-1; count++){
int u=findMinKey(dist,isVisited);
isVisited[u]=true;
//更新相邻节点的dist和父节点
for(int v=0; v<vertices; v++){
if(graph[u][v]!=0&&!isVisited[v]&&graph[u][v]<dist[v]){
dist[v]=graph[u][v];
parents[v]=u;
}
}
}
int distall=0;
for(int i=1; i<vertices; i++){
distall+=graph[i][parents[i]];
}
return distall;
}
public static int findMinKey(int[] dist,boolean[] isVisited){
int min = Integer.MAX_VALUE,MinIndex=-1;
for(int i=0;i<dist.length;i++){
if(!isVisited[i]&&dist[i]<min){
min=dist[i];
MinIndex=i;
}
}
return MinIndex;
}
}

浙公网安备 33010602011771号