题意:给你几个点 ,然后下一行就是给你其中一个点 然后跟着一个值,这个值表示有几个点和这个点之间有路径可走,让你求最小生成树,prime算法,就是输入的时候有一些麻烦,是字符ABCD之类的 我们要把字符先转换成整形再去做,字符串操作中很多我也喜欢这么做
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<iostream>
#include<algorithm>
#define maxn 0x3f3f3f3f
using namespace std;
int n,m1,m2;
char a1[10],a2[2];
int map[30][30],d[30];
bool vis[30];
void prime()
{
for(int i = 0; i < n; i ++)
{
d[i] = map[0][i];
vis[i] = 0;
}
for(int i = 0; i < n; i ++)
{
int minx = maxn;
int now;
for(int j = 0; j < n; j ++)
{
if(!vis[j] && minx > d[j])
{
now = j;
minx = d[j];
}
}
vis[now] = 1;
for(int k = 0; k < n; k ++)
{
if(!vis[k] && d[k] > map[now][k])
d[k] = map[now][k];
}
}
for(int i = 1; i < n; i ++)
d[0] += d[i];
printf("%d\n",d[0]);
}
int main()
{
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] = maxn;
}
for(int i = 1; i < n; i ++)
{
scanf("%s%d",a1,&m1);
for(int j = 0; j < m1; j ++)
{
scanf("%s%d",a2,&m2);
map[a1[0]- 'A'][a2[0] - 'A'] = map[a2[0]- 'A'][a1[0] - 'A'] = m2;
}
}
prime();
}
return 0;
}