题目:http://acm.pku.edu.cn/JudgeOnline/problem?id=1251

 

相应C代码:

#include<stdio.h>
#include<stdlib.h>


main()
{
char x,y;
int i,j,m,n,c,k,min,dex,u,t,tol=0; //x,y记录坐标  min记录最小弧
int arc[100][100];
int num1[100];
int num2[100];
int length;//计数
for(i=0;i<100;i++)
  for(j=0;j<100;j++)
     arc[i][j]=RAND_MAX; //无穷大
  scanf("%d",&m);//节点数
  while(m!=0)
  {
   length=0;
 

  for(i=1; i<=m-1; i++)
  {
   scanf( " %c %d",&x,&u);
   //getchar(); //吸收第一个空格
   for(j=0;j<u;j++)
   {
    scanf(" %c %d",&y,&c);
    //getchar();
    arc[x-65][y-65]=c;  //赋值
       arc[y-65][x-65]=c;
   }
 
     
  }
  for(i=0;i<m;i++)
   num1[i]=-1;
  for(i=0;i<m;i++)
   num2[i]=-1;

  num1[0]=0;
  for(i=0;i<m-1;i++)
   num2[i]=i+1;
  for(i=1;i<=m-1;i++)
  {

   k=0;
   min=RAND_MAX;
   while(num1[k]!=-1)
   {
    for(j=0;j<m;j++)
    {
    if(num2[j]!=-1)//筛选
    {
         
      if(arc[num1[k]][num2[j]]<min)
      {
       min=arc[num1[k]][num2[j]];
          dex=num2[j];
       t=j;
      }

          

    }

              
    }
  
  
   
   k++;
  
   } //while
      num2[t]=-1;
   length=length+min;   //找出最短的弧,并计数

   num1[i]=dex;       //入数组
  }
 
  printf("%d\n",length);
  scanf("%d",&m);//节点数
  }     

}

 

 PS:想了一天,这个算法主要是利用普里姆算法求最小生成树。http://blog.sina.com.cn/s/blog_4aac2b6d0100es5q.html这里有详细的讲解。

理解后就开始着手编写了。

输出的结果完全正确的,测试了几组数据都可以,但在北大ACM上提交没能成功,后来系统还瘫痪了。原因嘛...还在探讨中,请阅读了的朋友能够指出,感激不尽啊~

还有两道题目,加油!

posted on 2010-03-05 18:36  KuSiuloong  阅读(200)  评论(0编辑  收藏  举报