HDU5627 Clarke and MST【Kruscal算法+并查集】

Clarke and MST

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 829 Accepted Submission(s): 478

Problem Description
Clarke is a patient with multiple personality disorder. One day he turned into a learner of graph theory.
He learned some algorithms of minimum spanning tree. Then he had a good idea, he wanted to find the maximum spanning tree with bit operation AND.
A spanning tree is composed by n−1 edges. Each two points of n points can reach each other. The size of a spanning tree is generated by bit operation AND with values of n−1 edges.
Now he wants to figure out the maximum spanning tree.

Input
The first line contains an integer T(1≤T≤5), the number of test cases.
For each test case, the first line contains two integers n,m(2≤n≤300000,1≤m≤300000), denoting the number of points and the number of edge respectively.
Then m lines followed, each line contains three integers x,y,w(1≤x,y≤n,0≤w≤109), denoting an edge between x,y with value w.
The number of test case with n,m>100000 will not exceed 1.

Output
For each test case, print a line contained an integer represented the answer. If there is no any spanning tree, print 0.

Sample Input
1
4 5
1 2 5
1 3 3
1 4 2
2 3 1
3 4 7

Sample Output
1

Source
BestCoder Round #72 (div.2)

问题链接HDU5627 Clarke and MST
问题简述:给定n个结点和m条边及其权值,构造一棵生成树,使得生成树的权值按位与(&)值最大。
问题分析:用Kruscal算法解决。
程序说明:(略)
参考链接:(略)
题记:(略)

AC的C++语言程序如下:

/* HDU5627 Clarke and MST */

#include <bits/stdc++.h>

using namespace std;

const int N = 300000;
int f[N + 1], fcnt;
void UFInit(int n) {for(int i = 0; i <= n; i++) f[i] = i, fcnt = n;}
int Find(int a) {return a == f[a] ? a : f[a] = Find(f[a]);}

struct Edge
{
    int u, v, w;
} e[N];
int cmp(Edge a, Edge b)
{
    return a.w > b.w;
}

int main()
{
    int t, n, m;
    scanf("%d", &t);
    while(t--) {
        scanf("%d%d", &n, &m);

        UFInit(n);

        for(int i = 0; i < m; i++)
            scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);

        sort(e, e + m, cmp);

        // Kruscal算法
        int flag = 1, ans;
        for(int i = 0; i < m; i++) {
            int u = Find(e[i].u);
            int v = Find(e[i].v);
            if(u != v) {
                if(flag) {ans = e[i].w; flag = 0;}
                else ans &= e[i].w;
                f[u] = v;
                fcnt--;
            }
        }

        if(fcnt == 1) printf("%d\n", ans);
        else printf("0\n");
    }

    return 0;
}
发布了2257 篇原创文章 · 获赞 2367 · 访问量 263万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览