点这里
题意: 给定一个无向图,含有n个点和m条边,每条边都有一个权值w。要求构造一个生成树,使得树的每条边的权值按位与结果最大。 题解: 用Kruskal算法就能轻松解决,只是要将所有边按从大到小的规则排序。
#include<bits/stdc++.h>
using namespace std
;
const int N
= 3e5 + 10;
int T
, n
, m
;
int cnt
, ans
, flag
;
int s
[N
];
int find(int x
){ return s
[x
] == x
? x
: s
[x
] = find(s
[x
]);}
struct edge
{ int u
, v
, w
;} e
[N
];
bool cmp(edge
&a
, edge
&b
){ return a
.w
> b
.w
;}
int main(){
scanf("%d", &T
);
while(T
--){
scanf("%d%d", &n
, &m
);
for(int i
= 1; i
<= n
; i
++) s
[i
] = i
; cnt
= n
, flag
= 1;
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
);
for(int i
= 0; i
< m
; i
++){
int u
= find(e
[i
].u
), v
= find(e
[i
].v
);
if(u
== v
) continue;
if(flag
) ans
= e
[i
].w
, flag
= 0;
else ans
&= e
[i
].w
;
s
[v
] = u
; cnt
--;
}
if(cnt
== 1) printf("%d\n", ans
);
else printf("0\n");
}
return 0;
}
转载请注明原文地址:https://tech.qufami.com/read-24074.html