首页 > 其他分享 >257. 关押罪犯

257. 关押罪犯

时间:2022-11-29 15:47:59浏览次数:65  
标签:typedef return 关押 int long 罪犯 257 define

题目链接

257. 关押罪犯

\(S\) 城现有两座监狱,一共关押着 \(N\) 名罪犯,编号分别为 \(1 \sim N\)。

他们之间的关系自然也极不和谐。

很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。

我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。

如果两名怨气值为 \(c\) 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为 \(c\) 的冲突事件。

每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到 \(S\) 城 \(Z\) 市长那里。

公务繁忙的 \(Z\) 市长只会去看列表中的第一个事件的影响力,如果影响很坏,他就会考虑撤换警察局长。

在详细考察了 \(N\) 名罪犯间的矛盾关系后,警察局长觉得压力巨大。

他准备将罪犯们在两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。

假设只要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。

那么,应如何分配罪犯,才能使 \(Z\) 市长看到的那个冲突事件的影响力最小?这个最小值是多少?

输入格式

第一行为两个正整数 \(N\) 和 \(M\),分别表示罪犯的数目以及存在仇恨的罪犯对数。

接下来的 \(M\) 行每行为三个正整数 \(a_j,b_j,c_j\),表示 \(a_j\) 号和 \(b_j\) 号罪犯之间存在仇恨,其怨气值为 \(c_j\)。

数据保证 \(1 \le a_j < b_j < N,0 < c_j \le 10^9\) 且每对罪犯组合只出现一次。

输出格式

输出共 \(1\) 行,为 \(Z\) 市长看到的那个冲突事件的影响力。

如果本年内监狱中未发生任何冲突事件,请输出 \(0\)。

数据范围

\(N \le 20000, M \le 100000\)

输入样例:

4 6
1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884

输出样例:

3512

解题思路

染色法判定二分图,二分

对于同一个监狱来说,增加一个犯人,只可能增加边权的最大值,即本题答案具有单调性,不妨考虑二分答案 \(x\),对于小于等于 \(x\) 的边的两个端点,显然无论这两个点放在二分图的哪一个集合都不会影响答案,故只需要那些大于 \(x\) 的边的两个端点,即这两个端点不可能放在同一个集合中,即问这些点形成的图是否为二分图,染色法判定即可

  • 时间复杂度:\(O((n+m)\times logw)\)

贪心,扩展域并查集

贪心策略:向将所有的边权按从大到小排序,两边的端点尽量不放在一个集合里面,直到矛盾出现该权值即答案

证明:要使所有满足要求的边权的最大值最小,即两个集合内部的边权要尽量小,由于从大到小排序,一开始的边权对应的两个端点应该放在两个不同的集合,否则后面所有构成的答案都要小于等当前权值,即当前权值就是答案,故需要维护两个点属于不同类,可用扩展域并查集实现

  • 时间复杂度:\(O(mlogm)\)

代码

  • 二分
// Problem: 关押罪犯
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/description/259/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// %%%Skyqwq
#include <bits/stdc++.h>
 
//#define int long long
#define help {cin.tie(NULL); cout.tie(NULL);}
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
 
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
 
template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }
 
template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}

const int N=20005,M=200005;
int n,m;
int h[N],ne[M],w[M],e[M],idx;
int color[N];
void add(int a,int b,int c)
{
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
bool dfs(int x,int c,int limit)
{
	color[x]=c;
	for(int i=h[x];~i;i=ne[i])
	{
		if(w[i]<=limit)continue;
		int y=e[i];
		if(!color[y])
		{
			if(!dfs(y,3-c,limit))return false;
		}
		else if(color[y]==c)return false;
	}
	return true;
}
bool ck(int x)
{
	for(int i=1;i<=n;i++)color[i]=0;
	for(int i=1;i<=n;i++)
		if(!color[i])
			if(!dfs(i,1,x))return false;
	return true;
}
int main()
{
	memset(h,-1,sizeof h);
    scanf("%d%d",&n,&m);
    int l=0,r=0;
    for(int i=1;i<=m;i++)
    {
    	int x,y,z;
    	scanf("%d%d%d",&x,&y,&z);
    	add(x,y,z),add(y,x,z);
    	r=max(r,z);
    }
    while(l<r)
    {
    	int mid=l+r>>1;
    	if(ck(mid))r=mid;
    	else
    		l=mid+1;
    }
    printf("%d",l);
    return 0;
}
  • 贪心
// Problem: 关押罪犯
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/description/259/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// %%%Skyqwq
#include <bits/stdc++.h>
 
//#define int long long
#define help {cin.tie(NULL); cout.tie(NULL);}
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
 
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
 
template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }
 
template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}

const int N=40005,M=100005;
int n,m;
int fa[N];
struct A
{
	int x,y,z;
	bool operator<(const A &o)const
	{
		return z>o.z;
	}
}a[M];
int find(int x)
{
	return x==fa[x]?x:fa[x]=find(fa[x]);
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=2*n;i++)fa[i]=i;
	for(int i=1;i<=m;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
	sort(a+1,a+1+m);
	for(int i=1;i<=m;i++)
	{
		int x=a[i].x,y=a[i].y;
		if(find(x)==find(y))
		{
			printf("%d",a[i].z);
			return 0;
		}
		fa[find(x)]=find(y+n),fa[find(x+n)]=find(y);
	}
	puts("0");
    return 0;
}

标签:typedef,return,关押,int,long,罪犯,257,define
From: https://www.cnblogs.com/zyyun/p/16935537.html

相关文章

  • ABC257G
    设\(f(S)\)表示将字符串\(S\)拆分成\(T\)的前缀相连,最少需要划分成几段。需要注意到一个性质,每个字符串被拆分时,最后一个子串应尽可能长。换句话说,若字符串\(A,B\)......
  • leetcode257-二叉树的所有路径
    257.二叉树的所有路径 泪目,自己写出的递归遍历./***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*......
  • 力扣 257. 二叉树的所有路径
    257.二叉树的所有路径给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。示例1:输入:root=[1......
  • leetcode-257-easy
    BinaryTreePathsGiventherootofabinarytree,returnallroot-to-leafpathsinanyorder.Aleafisanodewithnochildren.Example1:Input:root=......
  • AcWing1251 打击罪犯--并查集
    #include<bits/stdc++.h>#definepbpush_back#definefifirst#definesesecond#defineall(x)(x).begin(),(x).end()#defineSZ(x)(int)(x).size()usingnam......
  • 《安富莱嵌入式周报》第257期:2022.03.14--2022.03.20
    ​​​​ 本周视频教程更新:DSP视频教程第4期:MatlabSimulink生成C工程代码在STM32上运行(2022-03-17)​​https://www.armbbs.cn/forum.php?mod=viewthread&tid=111464​​ ......
  • 代码随想录day17 |110. 平衡二叉树 257. 二叉树的所有路径 404. 左叶子之和
    110.平衡二叉树题目|文章思路比较高度适合用后序遍历,前序遍历时间复杂度高。实现点击查看代码classSolution{public:boolisBalanced(TreeNode*root){......
  • FR257-ASEMI快恢复二极管FR257
    编辑:llFR257-ASEMI快恢复二极管FR257型号:FR257品牌:ASEMI封装:R-3正向电流:2.5A反向电压:1000V引线数量:2芯片个数:1芯片尺寸:72MIL漏电流:5ua恢复时间:500ns浪涌电流:100A芯片材质:正......
  • 代码随想录训练营|Day 17|110,257,404
    110.BalancedBinaryTreeGivenabinarytree,determineifitisheight-balanced.Forthisproblem,aheight-balancedbinarytreeisdefinedas:abinarytre......
  • 洛谷 CF1257F Make Them Similar 灰 题解
    前言本题解采用折半搜索算法完成,对于不打算用这种方法的同学,这篇题解可能会浪费你人生中宝贵的十几分钟。思路此题似乎找不出什么好的性质,那么考虑暴力。发现\(x,a\)......