题目地址:SDUT 3362
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
const int Maxn=1010;
int mp[Maxn][Maxn];
int vis[Maxn];
int dis[Maxn];
void prim(int n)
{
int i,j,k;
int min1;
int sum=0,flag=0;
memset(vis,0,sizeof(vis));
for(i=0;i<=n;i++)
dis[i]=mp[1][i];
vis[1]=1;
for(i=2;i<=n;i++){
min1=inf;
for(j=1;j<=n;j++){
if(min1>dis[j]&&!vis[j]){
k=j;
min1=dis[j];
}
}
if(min1==inf) {
flag=1;
break;
}
vis[k]=1;
sum+=min1;
for(j=1;j<=n;j++){
if(mp[k][j]<dis[j]&&!vis[j]){
dis[j]=mp[k][j];
}
}
}
if(flag) printf("-1\n");
else printf("%d\n",sum);
}
int main()
{
int n,m,i,j;
int u,v,w;
while(~scanf("%d %d",&n,&m)){
for(i=0;i<=n;i++){
for(j=0;j<=n;j++)
if(i==j) mp[i][j]=mp[j][i]=0;
else mp[i][j]=mp[j][i]=inf;
}
while(m--){
scanf("%d %d %d",&u,&v,&w);
if(w<mp[u][v]){
mp[u][v]=mp[v][u]=w;
}
}
prim(n);
}
return 0;
}