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;
}

posted @ 2010-04-30 22:30  北海小龙  阅读(243)  评论(0编辑  收藏  举报