今天也是为了cc,努力奋斗的一天ヾ(≧▽≦*)o
疑问
暂无
代码
/*
稠密图使用prim算法
村庄从1到N开始标号
*/
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MAXV=110;
const int INF=1000000000;
int G[MAXV][MAXV];
int d[MAXV];
//是否已访问数组
int vis[MAXV] = {false};
int len;
int n;
int prim(){
//各种初始化操作
fill(d,d+MAXV,INF);
d[1] = 0; //注意村庄是从1开始标号到N的
//由于prim是点贪心,所以需要n次循环
for(int i=0;i<n;i++){
int min=INF;
int u=-1;
//村庄编号从1开始的
for(int j=1;j<=n;j++){
if(vis[j] == false && min > d[j]){
min = d[j];
u = j;
}
}
//如果出现了不连通的图
if(u == -1){
return -1;
}
vis[u] = true;
len += d[u];
for(int v=1;v<=n;v++){
if(vis[v] == false && G[u][v] != INF && G[u][v] < d[v]){
d[v] = G[u][v];
}
}
}
}
int main(){
while(~scanf("%d",&n)){
if(n == 0){
break;
}
len = 0;
//对G进行初始化
fill(G[0],G[0]+MAXV*MAXV,INF);
fill(vis,vis+MAXV,false);
for(int i=0;i<(n*(n-1))/2;i++){
int a,b,distance;
scanf("%d %d %d",&a,&b,&distance);
G[a][b] = distance;
G[b][a] = distance;
}
prim();
printf("%d\n",len);
}
return 0;
}
反思
INF
可以赋值为0x3fffffff
(即 ,int
类型的最大值),但是如果实在记不住的话,1000000000
(即 )也是可行的;- 养成使用
++i
代替i++
的习惯。