HDU5627 Clarke and MST——最大生成树

tech2025-09-10  33

点这里

题意: 给定一个无向图,含有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; //init() 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; }
最新回复(0)