#include<stdio.h>
int main()
{
int n,map[27][27],dist[27];
const int MAX = 10000000;
while(scanf("%d",&n)&&n)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j) map[i][j]=0;
else map[i][j]= MAX;
}
for(int i=0;i<n-1;i++)
{
char a,b;
int m,x;
getchar();
scanf("%c%d",&a,&m);
while(m--)
{
getchar();
scanf("%c%d",&b,&x);
map[a-'A'][b-'A']=x;
map[b-'A'][a-'A']=x;
}
}
for(int i=0;i<n;i++)
{
dist[i]=map[0][i];
}
for(int i=0;i<n;i++)
{
int k=0;
int min=100;
for(int j=0;j<n;j++)
{
if(dist[j]>0&&dist[j]<min){
min=dist[j];
k=j;
}
}
dist[k]=-dist[k];
for(int j=0;j<n;j++)
{
if(dist[j]==MAX&&map[k][j]>0) dist[j]=map[k][j];
else if(dist[j]>0&&map[k][j]>0&&map[k][j]<dist[j]) dist[j]=map[k][j];
}
}
int sum=0;
for(int i=0;i<n;i++)
{
sum-=dist[i];
}
printf("%d\n",sum);
}
return 0;
}
做完这题对zoj敬佩不已了。。。 用的prim算法, 表示本来偷懒将无法到达设置为-1 结果,因为二次偷懒将到达过得距离设置为负数(老师上课讲的时候这么做的,效果不错,省新创一个数组了。。。) 结果-1有可能和负数重复, 导致已经加进去的点,本来为-1的距离当作没有加进过的点进行二次的更改距离。。。 导致WA了。。。 贴代码