本题是一个裸的最小生成树,直接使用prime算法来进行计算,利用vector来进行容器计算即可
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=30;
struct node{
int v;
int len;
node(int v,int len):v(v),len(len){};
friend bool operator <(node a,node b){
return a.len>b.len;
}
};
vector<node>G[maxn];
int vis[maxn];
int prime(int a)
{
priority_queue<node> pq;
memset(vis,0,sizeof(vis));
vis[a]=1;
int ans=0;
for(int i=0;i<G[a].size();i++)
pq.push(G[a][i]);
while(!pq.empty())
{
node st=pq.top();pq.pop();
if(vis[st.v]==0)
{
for(int i=0;i<G[st.v].size();i++)
pq.push(G[st.v][i]);
vis[st.v]=1;
ans+=st.len;
}
}
return ans;
}
void init()
{
for(int i=0;i<maxn;i++)
G[i].clear();
}
int main()
{
int t;
//freopen("A.txt","r",stdin);
while(scanf("%d",&t)!=EOF&&t)
{
char s[10];
int a,n,m,len;
init();
for(int k=1;k<t;k++)
{
scanf("%s%d",&s,&n);
a=s[0]-'A';
while(n--)
{
scanf("%s%d",&s,&len);
int b=s[0]-'A';
G[a].push_back(node(b,len));
G[b].push_back(node(a,len));
}
}
int ans=prime(a);
printf("%d\n",ans);
}
return 0;
}