题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863
题目意思:没啥变化基本跟HDU 1233 一样
#include<stdio.h>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
#define MAX 30005
int p[101],sum,num; //p为并查集
struct edge//图的结构体
{
int sv,ev,w;//起始边,终边,权值。
};
struct edge e[10000];//必须开到大于(n*n-1)/2,否则必然RE。。。
bool cmp(const edge &a, const edge &b )
{
if(a.w < b.w)
return 1;
return 0;
}
int find(int x){//并查集find函数
if(x == p[x]) return x;
else return find(p[x]);
// return p[x] == x ? x : (p[x] = find(p[x]));//压缩路径
}
void merge(int x,int y,int w){//并查集merge函数
x = find(x); y = find(y);
if(x != y){
p[x] = y; sum += w; num++;
}
}
int main(){
int n,m,i;
while(scanf("%d",&n) && n != 0)
{
scanf("%d",&m);
sum = 0; num = 1;
for(i = 1;i <= m; i++) p[i] = i;//初始化并查集
for(i = 0;i < n; i++){
scanf("%d %d %d",&e[i].sv,&e[i].ev,&e[i].w);
}
sort(e,e+n,cmp);
for(i = 0; i < n; i++)
{
merge(e[i].sv,e[i].ev,e[i].w);
if(num == m) break;
}
if( num == m ) printf("%d\n",sum);
else printf("?\n");
}
return 0;
}