[题目链接]
https://www.luogu.org/problemnew/show/P1525
[算法]
贪心地思考这个问题,我们优先考虑“怒气值”大的罪犯,尝试不将他们分在同一监狱,如果必须分在同一间监狱,那么,就不需考虑其余的罪犯了
显然,并查集是可以完成这个任务的
[代码]
#include<bits/stdc++.h> using namespace std; #define MAXN 20010 #define MAXM 100010 struct info { int u,v,w; } a[MAXM]; int i,n,m; int fa[MAXN<<1]; inline bool cmp(info a,info b) { return a.w > b.w; } inline int get_root(int x) { if (fa[x] == x) return x; return fa[x] = get_root(fa[x]); } int main() { scanf("%d%d",&n,&m); for (i = 1; i <= m; i++) scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w); sort(a+1,a+m+1,cmp); for (i = 1; i <= 2 * n; i++) fa[i] = i; for (i = 1; i <= m; i++) { if (get_root(a[i].u) == get_root(a[i].v)) { printf("%d ",a[i].w); return 0; } else { fa[get_root(a[i].u)] = get_root(a[i].v+n); fa[get_root(a[i].v)] = get_root(a[i].u+n); } } printf("0 "); return 0; }