# 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)

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;
} ©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503 