疑问
暂无
代码
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MAXV = 30;
const int INF = 0x3fffffff;
int G[MAXV][MAXV];
int d[MAXV];
bool vis[MAXV];
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=0;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=0;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=1;i<n;i++){
char start;
int number;
getchar();
scanf("%c %d",&start,&number);
int a = start - 'A';
for(int j=0;j<number;j++){
char end;
int cost;
getchar();
scanf("%c %d",&end,&cost);
int b = end - 'A';
G[a][b] = G[b][a] = cost;
}
}
prim();
printf("%d\n",len);
}
return 0;
}
反思
- 使用
scanf()
读入字符之前,要注意使用getchar()
吸收前面多余的换行、空格等等;