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.

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.

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

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

Sample Output

BestCoder Round #72 (div.2)

问题链接HDU5627 Clarke and MST


/* 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);


        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;

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

    return 0;
发布了2257 篇原创文章 · 获赞 2367 · 访问量 263万+


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