#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define maxn 500
#define maxm 500*500/2
using namespace std;
int T,n,m;
struct edge{
int u;
int v;
int k;
bool operator<( const edge & e1 )const{
return k>e1.k;
}
edge(int u,int v,int k){
this->u=u;this->v=v;this->k=k;
}
edge(){
u=v=k=0;
}
}E[maxm*2+100];
priority_queue<edge>Q;
int pa[maxn+10];
void initpa(){
for(int i=0;i<n;i++){
pa[i]=i;
}
}
int findset(int x){
return x==pa[x]?x:pa[x]=findset(pa[x]);
}
int kraskul(){
int ans=0;
initpa();
while(!Q.empty()){
edge te=Q.top();Q.pop();
int u=te.u,v=te.v,k=te.k;
int x=findset(u);int y=findset(v);
if(x!=y){
ans+=k;
pa[x]=y;
}
}
return ans;
}
int main(){
// freopen("in.txt","r",stdin);
scanf("%d",&T);while(T--){
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int u,v,k;
scanf("%d%d%d",&u,&v,&k);
Q.push(edge(u,v,k));
}
cout<<kraskul()<<endl;
}
}
ZOJ2966最小生成树
最新推荐文章于 2018-09-26 14:54:00 发布