依旧是Prim最小生成树的题目。
直接下手写。
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# define INF 10000000
int n;
int graph[30][30];
char c,ch;
int visit[30];
int dis[30];
void Init()
{
int i,j;
for(i = 1;i <= 26;i ++)
for(j = 1;j <= 26;j ++)
graph[i][j] = (i == j ? 0 : INF);
memset(visit,0,sizeof(visit));
memset(dis,0,sizeof(dis));
}
int work()
{
int ans,i,j,mincost,index;
visit[1] = 1;
for(i = 1;i <= n;i ++)
dis[i] = graph[1][i];
ans = 0;
for(i = 1;i < n;i ++)
{
mincost = INF;
for(j = 1;j <= n;j ++)
{
if(!visit[j] && dis[j] < mincost)
{
mincost = dis[j];
index = j;
}
}
visit[index] = 1;
ans += mincost;
for(j = 1;j <= n;j ++)
{
if(!visit[j] && graph[index][j] < dis[j])
dis[j] = graph[index][j];
}
}
return ans;
}
int main()
{
int i,j,num,v;
while(~scanf("%d",&n)&&n)
{
Init();
for(i = 1;i < n;i ++)
{
getchar();
scanf("%c %d",&c,&num);
if(num != 0)
{
for(j = 0;j < num;j ++)
{
getchar();
scanf("%c %d",&ch,&v);
graph[c-'A'+1][ch-'A'+1] = graph[ch-'A'+1][c-'A'+1] = v;
}
}
}
printf("%d\n",work());
}
return 0;
}