首页 > 试题广场 >

[NOIP2010]关押罪犯

[编程题][NOIP2010]关押罪犯
  • 热度指数:1185 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解

S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。

每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,如果影响很坏,他就会考虑撤换警察局长。

在详细考察了 N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。那么,应如何分配罪犯,才能使 Z 市长看到的那个冲突事件的影响力最小?这个最小值是多少?


输入描述:
第一行为两个正整数N和M,分别表示罪犯的数目以及存在仇恨的罪犯对数。 
接下来的M行每行为三个正整数aj,bj,cj,表示aj号和bj号罪犯之间存在仇恨,其怨气值为cj
数据保证1≤aj<bj≤N,0<cj≤1,000,000,000,且每对罪犯组合只出现一次。


输出描述:
共1行,为Z市长看到的那个冲突事件的影响力。如果本年内监狱中未发生任何冲突事件,请输出0。
示例1

输入

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

输出

3512

说明


罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件影响力是3512(由2号和3号罪犯引发)。其他任何分法都不会比这个分法更优。

备注:
对于30%的数据有N≤15。
对于70%的数据有N≤2000,M≤50000。
对于100%的数据有N≤20000,M≤100000。
头像 白给怪
发表于 2020-06-03 15:49:48
题目链接:https://ac.nowcoder.com/acm/problem/16591分析:因为市长只看最大影响力,所以我们将影响力从大到小排序,尽可能的去将会发生大影响的冲突避免(即将两个人分到两个监狱里面)下面解释一句话,敌人的敌人是朋友————假如 a和b会产生冲突,由于我们是将数组按照 展开全文
头像 DaMing
发表于 2020-06-02 10:51:49
题目描述S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同 展开全文
头像 弓长九日
发表于 2019-08-19 10:38:57
带权并查集+二分图解法 带权并查集 分析A,B之间的相对距离,可以得到rnk[fa] = rnk[A]+x-rnk[B]。 注意到这时,对于原来的A的树,只更新了fa跟结点的权值, 那么其它结点的更新在查找的那一步里面实行了。维护是相对距离 一开始 ab之间关系 a到b是s 在 fa fb 不一样 展开全文
头像 savage
发表于 2019-09-06 16:30:10
算法知识点:二分,染色法判断二分图 复杂度: 解题思路: 将罪犯当做点,罪犯之间的仇恨关系当做点与点之间的无向边,边的权重是罪犯之间的仇恨值。 那么原问题变成:将所有点分成两组,使得各组内边的权重的最大值尽可能小。 我们在之间枚举最大边权 ,当 固定之后,剩下的问题就是: 展开全文
头像 菜鸡aaa
发表于 2023-08-05 17:57:39
借鉴了别人的题解加上自己的理解 1、只有两座监狱,所以两个罪犯要么在同一个监狱要么在不同监狱 2、将影响力从大到小排序,从大到小枚举每个冲突,尽可能的让冲突避免(即将两个人分到不同监狱),直到出现无法避免冲突的情况,因为已经将冲突由大到小排序,之后的冲突都比这个冲突小,所以该冲突就是答案要求的。 3 展开全文
头像 Eihuvita.
发表于 2020-11-30 21:57:01
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押 展开全文
头像 sunny_forever
发表于 2021-08-06 12:10:47
思路 M 对互相仇恨的罪犯,我们按仇恨值从大到小排序,对于每一对互相仇恨的罪犯,我们要设法将他们分配在不同的监狱里,反正不能在同一监狱里 如果不可避免的在同一监狱了 也就是与我们的策略发生冲突了,那么此时的仇恨值就是答案 如果到最后都不曾发生冲突,那么答案是 0,因为此时:任意一对会冲突的罪犯 都 展开全文
头像 菜狗林末
发表于 2022-07-19 10:14:07
原题戳这里 关于这道题,本菜狗在阅读各位大佬的题解后终于大彻大悟,顺利ac,在此先感谢各位大佬的题解。 根据题目要求,我们需要将囚犯产生的冲突的影响力的最大值降到最小,这里有那么点贪心和二分答案的味道。这道题的标签是并查集,那么该如何使用并查集求解呢? 我们首先将冲突的情况保存在结构体数组里,并将其 展开全文
头像 -符拉迪沃斯托克-
发表于 2021-01-20 23:14:24
这是一道思路清奇的题。 关键就是:我敌人的敌人是我的朋友 所以当我和我敌人的敌人要发生冲突时,这个冲突不可避免。 因此把敌人关系按怨气值倒序排序,顺序扫一遍,发现不可避免的冲突就跳出循环,输出这对敌人得怨气值。 可以证明这个怨气值一定是最小的最大值。 附代码: #include<iostrea 展开全文
头像 louhc
发表于 2019-08-24 06:50:45
思路 这题可以用并查集或二分+二分图染色解决.首先二分答案,然后只要判断是否能将罪犯分成两个图,图的内部边权都不超过答案. 并查集 这样子可以直接使用并查集的边带权或者扩展域解决.对边从小到大排序.边带权的话,边权可以是两点是否相同,合并时如果有冲突判断就输出答案.扩展域的话也就是每个罪犯拆成两个点 展开全文