题目大意:n个党派,每个党派有2人,有m个冲突关系,选出n个人,要求每个党派各1人,且无冲突,输出一种方案。
题目描述
原题来自:POI 2001
根据宪法,Byteland 民主共和国的公众和平委员会应该在国会中通过立法程序来创立。 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍。
此委员会必须满足下列条件:
- 每个党派都在委员会中恰有 1 个代表,
- 如果 2 个代表彼此厌恶,则他们不能都属于委员会。
每个党在议会中有 2 个代表。代表从 1 编号到 2n。 编号为 2i−1 和 2i 的代表属于第 i 个党派。
任务:写一程序读入党派的数量和关系不友好的代表对,计算决定建立和平委员会是否可能,若行,则列出委员会的成员表。
输入
第一行有两个非负整数 n 和 m。他们各自表示:党派的数量 n 和不友好的代表对 m。 接下来 m 行,每行为一对整数 a,b,表示代表 a,b 互相厌恶。
输出
如果不能创立委员会,则输出信息NIE
。若能够成立,则输出包括 n 个从区间 1 到 2n 选出的整数,按升序写出,每行一个,这些数字为委员会中代表的编号。
如果委员会能以多种方法形成,程序可以只输出它们的某一个。
提示
样例输入
3 2
1 3
2 4
样例输出
1
4
5
1≤n≤8000,0≤m≤20000,1≤a < b≤2n
解题思路
如果两个人a和b有冲突,那么选a就不能选b,又要求每个党派都要选,那么只能选b党派中的另外一个人。
按照必选关系建图,缩点后,如果同一个党派的两人在一个集合,那么两人都选或都不选,不能达到n人每个党派各一人,无解。
对于有解情况,输出缩点后的DAG中拓扑序大的点即可。
提示1:2-SAT的图是对称了。
提示2:一个党派的两人,在DAG上,如果选择拓扑序小的显然不妥,因为他会必选更多的点,所以应该优先选择拓扑序大的。