HDOJ-1863(最小生成树)

来源:互联网 发布:路由选择算法要求 编辑:程序博客网 时间:2024/06/01 07:14

几乎裸的最小生成树:


#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;}


0 0
原创粉丝点击