POJ 1251题
//最小生成树:Prim
#include <stdio.h>
#include <string.h>
#define arraysize 28
int dis[arraysize][arraysize];
bool final[arraysize];
int d[arraysize];
int n;
int maxData = 0x7fffffff;
void Prim()
{
int i;
int j;
int v;
int min;
int sum = 0;
memset(final,0,sizeof(final));
for(i=1;i<n+1;++i)
{
d[i] = dis[1][i];
}
final[1] = true;
d[1] = 0;
v =1;
for(i=1;i<n;++i)
{
min = maxData;
for(j=1;j<n+1;++j)
{
if(!final[j] && min>d[j] && d[j]<maxData) //别忘了判断是否小于最大值
{
v = j;
min = d[j];
}
}
sum += min;
final[v] = true;
for(j=1;j<n+1;++j)
{
if(!final[j] && d[j]>dis[v][j] && dis[v][j]<maxData) //别忘了判断是否小于最大值
d[j] = dis[v][j];
}
}
printf("%d\n",sum);
}
int main()
{
//freopen("1.txt","r",stdin);
int k;
int cost;
int i,j;
char start[10],end[10];
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
//初始化临界矩阵
for(i=1;i<n+1;++i)
{
for(j=1;j<n+1;++j)
dis[i][j] = maxData;
}
for(i=1;i<n;++i)
{
//不要使用字符,直接读取字符串
scanf("%s%d",&start,&k);
for(j=1;j<k+1;j++)
{
scanf("%s%d",&end,&cost);
//将字符转换成数字,A的ASCII码65,双向的
dis[start[0]-64][end[0]-64] = cost;
dis[end[0]-64][start[0]-64] = cost;
}
}
Prim();
}
return 0;
}