链接:登录—专业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;
}
法二:二分+二分图染色:
还不会,先欠着。。。(哭)