-
-
给定一个有nn个点的无向图,其中有mm条权值为wiwi的边,问该图的最小生成树的费用为多少。
-
-
Input
-
第一行给定两个整数分别为nn,mm,分别代表完全图中有nn个点,有mm条权值为aiai的边
-
后面输入有mm行,每行三个值uu,vv,ww代表从uu到vv有一条权值为ww的边
-
-
Output
-
最小生成树的费用,如果无法生成最小生成树,则输出
Imp
-
-
Sample Input 1
2 0
-
Sample Output 1
Imp
-
Sample Input 2
3 2
1 2 2
1 3 3
-
Sample Output 2
5
-
代码部分:
-
#include <stdio.h>
#define maxnum 10000000
#define maxarray 1000
int u[maxarray];
int v[maxarray];
int w[maxarray];
int ifvisited[maxarray];
int map[maxarray][maxarray];
int m,n;
int vodei=-1;
int vodej=-1;
int cost=0;
int findmin(){
int temp=maxnum;
vodei=-1;
vodej=-1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(map[i][j]<temp && map[i][j]>0){
if(ifvisited[i]!=ifvisited[j]){
temp=map[i][j];
vodei=i;
vodej=j;
}
}
}
}
ifvisited[vodei] = 1;
ifvisited[vodej] = 1;
return temp;
}
void Prim(){
ifvisited[1]=1;
for(int k=1;k<=n-1;k++){
cost += findmin();
if (vodei == -1 || vodej == -1) { // 找不到边,图不连通
printf("Imp");
return;
}
}
printf("%d",cost);
return;
}
int main(){
scanf("%d",&n);
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d",&u[i]);
scanf("%d",&v[i]);
scanf("%d",&w[i]);
}
for(int i=1;i<=m;i++){
map[u[i]][v[i]]=w[i];
}
Prim();
return 0;
}
本文中此代码采用Prim树的生成方式,即先确定一个初始节点,再依次引入其周围的最小边节点(须为非环节点)即可以生长树的形式生成最小生成树。