几乎裸的最小生成树:
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
struct Edge{
int x, y, c;
friend bool operator < (const Edge& a, const Edge& b){
return a.c < b.c;
}
};
int set[100];
int Find(int x)
{
return x != set[x] ? set[x] = Find(set[x]) : x;
}
bool Union(int x, int y)
{
int px = Find(x), py = Find(y);
if(px != py){
set[px] = py;
return true;
}
return false;
}
int main()
{
int N, M, i, cost, connected;
Edge e;
vector<Edge> v;
while(scanf("%d %d", &M, &N), M){
//initialize
v.clear();
for(i = 1; i <= N; ++i) set[i] = i;
//input
for(i = 0; i < M; ++i){
scanf("%d %d %d", &e.x, &e.y, &e.c);
v.push_back(e);
}
//minimum spanning tree
connected = 1;
cost = 0;
sort(v.begin(), v.end());
for(i = 0; connected < N && i < M; ++i){
if(Union(v[i].x, v[i].y)){
cost += v[i].c;
++connected;
}
}
if(connected == N) printf("%d\n", cost);
else puts("?");
}
return 0;
}