图-hdu-1233

来源:互联网 发布:如何查手机mac地址 编辑:程序博客网 时间:2024/05/21 05:58

问题

题目:[hdu-1233]http://acm.hdu.edu.cn/showproblem.php?pid=1233

思路

这个题是MST,不多说了。
结合UnionFindSet搞定联通分量的合并。

代码

#include <cstdio>#include <cstring>#include <vector>#include <algorithm>#define N 100//#define LOCALusing std::vector;using std::sort;int tree[N + 8];void make_set( int n ){    for(int i = 1; i <= n; ++i){        tree[i] = -1;    }}int find_set(int i){    if( -1 == tree[i] ) return i;    else{        int ret = find_set( tree[i] );        tree[i] = ret;        return ret;    }}bool union_set(int i, int j){    int a = find_set(i);    int b = find_set(j);    if(a==b) return false;    else{        tree[b] = a;        return true;    }}struct Edge{    int u;    int v;    int c;    Edge(){memset(this, 0, sizeof(Edge));}    bool operator<(const Edge& rhs) const {        return this->c < rhs.c;    }};int main(void){#ifdef LOCAL    freopen( "../data/input.dat", "r", stdin );#endif    int n = 0;    while( scanf( "%d", &n ) != EOF, n != 0 ){        vector<Edge> edge_list;        Edge tmp;        int sz = n*(n-1)/2;        for(int i = 0; i < sz; ++i ){            scanf( "%d%d%d", &tmp.u, &tmp.v, &tmp.c );            edge_list.push_back(tmp);        }        sort(edge_list.begin(), edge_list.end());        make_set(n);        int ans = 0;        int cnt = 0;        for( int i = 0; i < sz; ++i ){            int& a = edge_list[i].u;            int& b = edge_list[i].v;            if( union_set(a, b) ){                ++cnt;                ans += edge_list[i].c;                if(cnt == n-1) break;            }            }        printf( "%d\n", ans );    }}
原创粉丝点击