http://acm.nyist.net/JudgeOnline/problem.php?pid=38
邻接矩阵+普利姆算法
#include<cstdio>
#include<iostream>
using namespace std;
#define M 10000
int main(void){ //普利姆算法
int n;
cin>>n;
while(n--){
int v,e,i,j,k,tv,mt=0; //mt为最小生成树权值
int a[501][501],eclose[2][501];
cin>>v>>e;
for(i=1;i<=v;i++)
for(j=1;j<=v;j++)
a[i][j]=M;
for(i=1;i<=e;i++){
int l,m;
cin>>l>>m;
cin>>a[l][m];
a[m][l]=a[l][m];
}
for(i=1;i<=v;i++)
eclose[0][i]=M;
k=1;
tv=1; //初始U集合只包含结点1,tv为新加入结点
eclose[0][1]=0;
eclose[1][1]=1;
while(k<v){ //依次加入v个结点
int dis=M,t;
for(i=1;i<=v;i++)
if(a[tv][i]<eclose[0][i]){
eclose[0][i]=a[tv][i];
eclose[1][i]=tv;
}
for(i=1;i<=v;i++) //找出最小未加入的边
if(eclose[0][i]!=0&&eclose[0][i]<dis){
dis=eclose[0][i];
t=i;
}
mt+=eclose[0][t]; //(tv,t)边权加入mt
eclose[0][t]=0; //t点加入U集合
eclose[1][t]=tv; //(tv,t)边加入最小生成树
tv=t; //tv更新为t
k++; //结点数加1
}
j=M;
for(i=1;i<=v;i++){
int t;
cin>>t;
t<j?j=t:j;
}
mt+=j;
cout<<mt<<endl;
}
// system("pause");
return 0;
}