题意:
给出一个N。接下来有一个N * N的邻接矩阵A,第 i 行 第 j 列代表点 i 和 j 相距A[i][j].求连同所有点的最短路径,求最小生成树即可。
思路:
用P算法,直接用邻接矩阵来存放数据就好了。
1 import java.util.Scanner; 2 public classMain { 3 final static int MAXN = 100 + 3; 4 final static int INF = 100000 + 3; 5 static int[][] arv = new int[MAXN][MAXN]; 6 static int[] used = new int[MAXN]; 7 static int[] lowCose = new int[MAXN]; 8 public static void main(String[] args){ 9 Scannercin = new Scanner(System.in); 10 int N; 11 while(cin.hasNext()){ 12 N = cin.nextInt(); 13 for(int i = 1; i <= N; i++){ 14 for(int j = 1; j <= N; j++){ 15 arv[i][j] = cin.nextInt(); 16 if(arv[i][j] == 0){ 17 arv[i][j] = INF; 18 } 19 } 20 } 21 int ans = prim(1, N); 22 System.out.println(ans); 23 } 24 cin.close(); 25 } 26 public static int prim(int sta, int N){ 27 for(int i = 1; i <= N; i++){ 28 lowCose[i] = arv[sta][i]; 29 used[i] = 0; 30 } 31 used[sta] = 1; 32 int cntWgt = 0; 33 for(int i = 1; i <= N -1; i++){ 34 int v = -1; 35 int mini = INF; 36 for(int j = 1; j <= N; j++){ 37 if(used[j] == 0 && mini > lowCose[j]){ 38 mini = lowCose[j]; 39 v = j; 40 } 41 } 42 if(v != -1){ 43 cntWgt += lowCose[v]; 44 used[v] = 1; 45 for(int j = 1; j <= N; j++){ 46 if(used[j] == 0 && lowCose[j] > arv[v][j]){ 47 lowCose[j] = arv[v][j]; 48 } 49 } 50 } 51 } 52 return cntWgt; 53 } 54 }