关押罪犯

题目大意:给定N个罪犯和M对敌对关系,每对敌对关系格式为“犯人A-犯人B-敌对程度”,要求将所有的罪犯关到两座监狱里,每对互相敌对的罪犯都一定会发生冲突,冲突程度为敌对程度,问怎样分才能使冲突程度总和最小?

我们可以维护两个集合表示两座监狱,用并查集当然是很方便的,重点在于如何分配个监狱的罪犯。

既然处于同一座监狱且互相敌对的两名罪犯一定会发生冲突,那么我们不妨将一名罪犯与其敌人的另一名敌人放在一座监狱,因为敌对关系并不具有传递性,也就是说,敌人的敌人就是朋友。

但是这样的方法并不能保证所有的罪犯都和睦相处,假设A有一个敌人B,B只有两个敌人A和C,而C又只有两个敌人B和A,那么无论怎样分配,都至少有一对罪犯会发生冲突。为了使总冲突最小,我们需要权衡利弊,在尽量避免冲突发生的同时控制不得不发生的冲突程度最小。

所以我们可以先将所有敌对关系按照敌对程度从大到小排序,接下来每次处理一对敌对关系:如果两位罪犯已经在同一座监狱(不得不发生冲突)则将其敌对程度作为其冲突程度累加到答案中;如果不在同一组,则按上面所述的“敌人的敌人就是朋友”的方法分组处理。

最后剩下无法处理的敌对关系,就是不得不发生的冲突中程度最小的。

Sorry potatoler, but I cannot recognize you.
Built with Hugo
Theme Stack designed by Jimmy