题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2034
//C++代码
#include<iostream>
#include<string>
#include<queue>
#include<map>
using namespace std;
struct Edge{
int u,v,w;
bool operator <(const Edge a) const{
return w>a.w;
}
}edge;
int n,s[2005];
priority_queue<Edge> pq;
void Union(int x,int y){
s[y]=x;
}
int Find(int x){
if(s[x]<0) return x;
return s[x]=Find(s[x]);
}
void Kruskal(){
int num=0,sum=0,i;
for(i=1;i<=n;i++) s[i]=-1;
while(!pq.empty() && num<n-1){
edge=pq.top();
pq.pop();
if(Find(edge.u)!=Find(edge.v)){
Union(Find(edge.u),Find(edge.v));
sum+=edge.w;
num++;
}
}
cout<<sum<<endl;
while(!pq.empty()) pq.pop();
}
int main(){
int t,m,c,i;
string a,b;
cin>>t;
while(t--){
cin>>n>>m;
map<string,int> p;
int num=1;
for(i=1;i<=m;i++){
cin>>a>>b>>c;
if(p.count(a)==0){
p.insert(make_pair(a,num));
num++;
}
if(p.count(b)==0){
p.insert(make_pair(b,num));
num++;
}
edge.u=p.find(a)->second;
edge.v=p.find(b)->second;
edge.w=c;
pq.push(edge);
}
Kruskal();
}
return 0;
}