题目: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上提交没能成功,后来系统还瘫痪了。原因嘛...还在探讨中,请阅读了的朋友能够指出,感激不尽啊~
还有两道题目,加油!