HD1814Peaceful Commission(模板题)
2016-04-10 11:49
302 查看
题目链接
题意:
此委员会必须满足下列条件:
每个党派都在委员会中恰有1个代表,
如果2个代表彼此厌恶,则他们不能都属于委员会。
每个党在议会中有2个代表。代表从1编号到2n。 编号为2i-1和2i的代表属于第I个党派。
任务
写一程序:
从文本文件读入党派的数量和关系不友好的代表对,
计算决定建立和平委员会是否可能,若行,则列出委员会的成员表,
结果写入文本文件。
输入
在文本文件的第一个行有2非负整数n和m。 他们各自表示:党派的数量n,1 < =n < =8000和不友好的代表对m,0 <=m <=20000。 在下面m行的每行为一对整数a,b,1<=a <b<=2n,中间用单个空格隔开。 它们表示代表a,b互相厌恶。
输出
如果委员会不能创立,文本文件中应该包括单词NIE。若能够成立,文本文件SPO.OUT中应该包括n个从区间1到2n选出的整数,按升序写出,每行一个,这些数字为委员会中代表的编号。如果委员会能以多种方法形成,程序可以只写他们的某一个。
样品输入
样品输出
View Code
题意:
和平委员会
根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立。 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍。此委员会必须满足下列条件:
每个党派都在委员会中恰有1个代表,
如果2个代表彼此厌恶,则他们不能都属于委员会。
每个党在议会中有2个代表。代表从1编号到2n。 编号为2i-1和2i的代表属于第I个党派。
任务
写一程序:
从文本文件读入党派的数量和关系不友好的代表对,
计算决定建立和平委员会是否可能,若行,则列出委员会的成员表,
结果写入文本文件。
输入
在文本文件的第一个行有2非负整数n和m。 他们各自表示:党派的数量n,1 < =n < =8000和不友好的代表对m,0 <=m <=20000。 在下面m行的每行为一对整数a,b,1<=a <b<=2n,中间用单个空格隔开。 它们表示代表a,b互相厌恶。
输出
如果委员会不能创立,文本文件中应该包括单词NIE。若能够成立,文本文件SPO.OUT中应该包括n个从区间1到2n选出的整数,按升序写出,每行一个,这些数字为委员会中代表的编号。如果委员会能以多种方法形成,程序可以只写他们的某一个。
样品输入
3 2 1 3 2 4
样品输出
1 4 5 分析:对于某个党两个代表只能选择一个,同时在厌恶的关系中的两个人只能有一个人存在,
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; const int Maxn = 8000 * 2 + 10; const int Maxm = 20000 * 2 + 10; //注意数据范围 struct Edge { int to, Next; }edge[Maxm]; int head[Maxn], tot; void init() { tot = 0; memset(head, -1, sizeof(head)); } void addedge(int u, int v) { edge[tot].to = v; edge[tot].Next = head[u]; head[u] = tot++; } bool vis[Maxn]; int S[Maxn], top; bool dfs(int u) { if (vis[u ^ 1]) return false; if (vis[u]) return true; vis[u] = true; S[top++] = u; for (int i = head[u]; i != -1; i = edge[i].Next) if (!dfs(edge[i].to)) return false; return true; } bool Twosat(int n) { memset(vis, 0, sizeof(vis)); for (int i = 0; i < n; i += 2) { if (vis[i] || vis[i ^ 1]) //已经选择了继续 continue; top = 0; if (!dfs(i)) { while (top) vis[ S[--top] ] = false; if (!dfs(i ^ 1)) return false; } } return true; } int main() { int n, m; int u, v; while (scanf("%d%d", &n, &m) != EOF) { init(); while (m--) { scanf("%d%d", &u, &v); u--; v--; addedge(u, v ^ 1); addedge(v, u ^ 1); } if (Twosat(n * 2)) { for (int i = 0; i < 2 * n; i++) if (vis[i]) printf("%d\n", i + 1); } else printf("NIE\n"); } return 0; }
View Code
相关文章推荐
- Mac OS启动服务优化高级篇(launchd tuning)
- rsync服务器的安装与配置
- [www.51kuaisou.com]最全的maven中央仓库
- __declspec的英文含义
- ANDROID垃圾回收器机制和强引用、软引用、弱引用、虚引用
- 剑指offer之替换字符串中的空格
- JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法
- 20145325张梓靖 实验一 "Java开发环境的熟悉"
- Struts2源码分析(三) 绘制Struts2执行的核心流程时序图并分析
- python-for循环使用
- Comparator 与Comparable的不同用法
- java final 修饰符
- Oracle SQL Developer 打开无法使用的问题
- jsp <c:forEach>循环 以及怎么统计变量的总数量
- Android中weight 出现权重大但是所占的比例小问题
- android扫一扫 二维码显示结果中文乱码
- FMDB中的数据处理
- Java中多线程使用匿名内部类的方式进行创建3种方式
- 集合之Vector
- 关于easyuidatagrid获取datagrid的选择数据