算法思想
Prim算法用来寻找一颗带权连通图图的最小生成树(MST)。采用的是贪心策略。
步骤如下:
- 选取一个节点作为树根。此时所有节点被分为在生成树中的和不在生成树中的两部分。
- 选取最短的一条连接生成树中的点与非树中的点的边,该点加入生成树集合。
- 重复2直至找不到这样的边为止。
代码实现
public class Prim {
static int[][] mp = new int[1001][1001]; //当数据规模超过10^5时会存不下
static int[] d = new int[1001];
static int[] vis = new int[1001];
static int n,m;
static int prim(){
Arrays.fill(vis, 0);
Arrays.fill(d, Integer.MAX_VALUE);
d[1] = 0;
int sum = 0;
for(int h=1;h<=n;h++){
int pos = 0;
for(int i=1;i<=n;i++){
if(vis[i]==0&&d[i]<d[pos])
pos = i;
}
if(pos==0) return -1; //图不连通
vis[pos] = 1;
sum +=d[pos];
for(int i=1;i<=n;i++){
if(vis[i]==0 && d[i]>mp[pos][i]){
d[i] = mp[pos][i];
}
}
}
return sum;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt(); m = in.nextInt();
for(int i= 1;i<=n;i++){
Arrays.fill(mp[i], Integer.MAX_VALUE); //mp[i][j] = MAX_VALUE 表示两点之间没有直接相连的边
}
for(int i=1;i<=m;i++){
mp[in.nextInt()][in.nextInt()] = in.nextInt();
}
System.out.println(prim());
}
}