一题多解:并查集+贪心/二分图染色

链接:登录—专业IT笔试面试备考平台_牛客网
题意是求不可避免的冲突的最小值,不难想到贪心。可以先用sort把影响值按降序排列,之后对于每一对冲突,能分就分,分不了了,这一对的影响值就是答案了。

那么这题和我之前写过的食物链就是一个思路了,假设有监狱A和B,对于每一对罪犯a,b,a关进A,b关进B这种情况和a关进B,b关进A在逻辑上是自洽的。那么我们用并查集把两种情况都考虑到的话,就很简单了,中间有矛盾了就直接输出并结束程序,然后在循环外面输出0就可以了(无不可避免的矛盾)。

代码:
 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,m;
int fa[40010];
int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
struct ty{
	int a,b,c;
}mas[100010];
bool cmp(ty x,ty y){
	return x.c>y.c;
}
void hebin(int x,int y){
	fa[find(x)]=find(y);
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=2*n;++i) fa[i]=i;
    for(int i=1;i<=m;++i) cin>>mas[i].a>>mas[i].b>>mas[i].c;
    sort(mas+1,mas+1+m,cmp);
    for(int i=1;i<=m;++i){
    	int x=mas[i].a;
    	int y=mas[i].b;
    	if(find(x)==find(y)||find(x+n)==find(y+n)){
    		cout<<mas[i].c<<endl;
    		return 0;
		}
		else{
			hebin(x,y+n);
			hebin(x+n,y);
		}
	}
	cout<<0<<endl;
	return 0;
}

法二:二分+二分图染色:

还不会,先欠着。。。(哭)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值