DALAO们,为什么纯贪心只有30分啊?
查看原帖
DALAO们,为什么纯贪心只有30分啊?
728090
RaynorLzj楼主2024/7/10 16:16
// Problem: P1525 [NOIP2010 提高组] 关押罪犯
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1525
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)
// 考虑构建矛盾关系网
// 贪心一下
// 枚举max边,放到两边,然后依次轮放,当不可避免发生冲突时,输出就行

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ull unsigned long long
#define pb push_back
#define pii pair<int, int>
#define il inline
#define fastio ios::sync_with_stdio(false), cin.tie(0)
const int N=1e5+5;
int n,m;
struct Edge{
	int u, v, w;
	bool operator < (const Edge & ano){
		return w < ano.w;
	}
} E[N];
int B[N];
int MX1[N];  /// 1号监狱会发生的冲突最大值
int MX2[N];
vector<pii> G[20005];
int Not(int x){
	if(x == 1) return 2;
	if(x == 2) return 1;
	return -1;
}
int main(){
	fastio;
	cin >> n >> m;
	for(int i=1; i<=m; i++){
		int ai, bi, ci;
		cin >> ai >> bi >> ci;
		E[i] = {ai, bi, ci};
		G[ai].pb({bi, ci}), G[bi].pb({ai, ci});
	}
	sort(E+1, E+m+1);
	for(int k=m; k>=1; k--){
		Edge & ed = E[k];
		if(!B[ed.u] && !B[ed.v]){
			// Plan A ed.u->1  ed.v->2
			// Plan B ed.u->2  ed.v->1
			int mx1=0, mx2=0;
			for(pii e : G[ed.u]){
				if(B[e.first] == 1) mx1 = max(mx1, e.second);
				if(B[e.first] == 2) mx2 = max(mx2, e.second);
			}
			for(pii e : G[ed.v]){
				if(B[e.first] == 2) mx1 = max(mx1, e.second);
				if(B[e.first] == 1) mx2 = max(mx2, e.second);
			}
			if(mx1 < mx2){
				B[ed.u] = 1;
				B[ed.v] = 2;
			}
			else B[ed.u] = 2, B[ed.v] = 1;
			
		}
		else if(!B[ed.u]){  // u未进入,v已经进入
			if(B[ed.v] == 1)
				B[ed.u] = 2;
			else if(B[ed.v] == 2)
				B[ed.u] = 1;
		}
		else if(!B[ed.v]){
			if(B[ed.u] == 1)
				B[ed.v] = 2;
			else if(B[ed.u] == 2)
				B[ed.v] = 1;
		}
		else{  // 均在集合中
			if(B[ed.u] == B[ed.v]){
				printf("%d\n", ed.w);
				return 0;
			}
		}
	}
	printf("0\n");
	return 0;
}

2024/7/10 16:16
加载中...