题意:
给出一个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 }