[POJ 1417] True Liars
[题目链接]
http://poj.org/problem?id=1417
[算法]
首先,我们发现 :
如果A说B是好人,那么A和B是同一类人,否则A和B不是同一类人
利用这个性质,用并查集维护这些人之间的关系
问题就转化成了有Cnt个集合,每个集合里包含两类人,我们在每个集合里选出一类人,使得最后共有P1个人
背包即可,由于最后要输出哪些是好人,因此,只需判断方案是否唯一,沿着dp数组递推即可
[代码]
#include <algorithm> #include <bitset> #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <exception> #include <fstream> #include <functional> #include <limits> #include <list> #include <map> #include <iomanip> #include <ios> #include <iosfwd> #include <iostream> #include <istream> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stdexcept> #include <streambuf> #include <string> #include <utility> #include <vector> #include <cwchar> #include <cwctype> #include <stack> #include <limits.h> using namespace std; #define MAXN 1010 #define MAXP 610int i,j,n,p1,p2,tot,now,x,y; int a[MAXN],b[MAXN],fa[MAXP<<1],d[MAXP<<1],id[MAXP<<1]; char k[MAXN][5]; int dp[MAXP<<1][MAXP]; vector< int > ans; vector< int > p[MAXP<<1][2];inline int get_root(int x) {if (fa[x] == x) return x;int f = get_root(fa[x]);d[x] = d[x] ^= d[fa[x]];return fa[x] = f; }int main() {while (scanf("%d%d%d",&n,&p1,&p2) != EOF && (n || p1 || p2)){for (i = 1; i <= n; i++) scanf("%d%d%s",&a[i],&b[i],&k[i]);for (i = 1; i <= p1 + p2; i++) {fa[i] = i;d[i] = 0;}for (i = 1; i <= n; i++){x = get_root(a[i]);y = get_root(b[i]);if (strcmp(k[i],"yes") == 0) {fa[x] = y;d[x] = d[a[i]] ^ d[b[i]];} else{fa[x] = y;d[x] = d[a[i]] ^ d[b[i]] ^ 1;} }tot = 0;memset(id,0,sizeof(id));for (i = 1; i <= p1 + p2; i++) {p[i][0].clear();p[i][1].clear();}for (i = 1; i <= p1 + p2; i++){x = get_root(i);if (!id[x]) id[x] = ++tot;p[id[x]][d[i]].push_back(i);}memset(dp,0,sizeof(dp));dp[0][0] = 1;for (i = 1; i <= tot; i++){for (j = 0; j <= p1 + p2; j++){if (j - p[i][0].size() >= 0) dp[i][j] += dp[i-1][j-p[i][0].size()];if (j - p[i][1].size() >= 0) dp[i][j] += dp[i-1][j-p[i][1].size()];}}if (dp[tot][p1] == 1){ans.clear();now = p1;for (i = tot; i >= 1; i--){if (now - p[i][0].size() >= 0 && dp[i-1][now-p[i][0].size()]){for (j = 0; j < p[i][0].size(); j++)ans.push_back(p[i][0][j]);now -= p[i][0].size();} else{for (j = 0; j < p[i][1].size(); j++)ans.push_back(p[i][1][j]);now -= p[i][1].size();}}sort(ans.begin(),ans.end());for (i = 0; i < ans.size(); i++) printf("%d\n",ans[i]);printf("end\n");} else printf("no\n");}return 0; }
转载于:https://www.cnblogs.com/evenbao/p/9322101.html
[POJ 1417] True Liars相关推荐
- POJ 1417 True Liars(路径压缩并查集+DP背包问题)
POJ 1417 True Liars(路径压缩并查集+DP背包问题) http://poj.org/problem?id=1417 题意: 给出p1+p2个人,其中p1个是好人,p2个是坏人.然后有 ...
- POJ 1417 True Liars 并查集+背包
题目链接:http://poj.org/problem?id=1417 解题思路:比较容易想到的是并查集,然后把第三组数据测试一下之后发现这并不是简单的并查集,而是需要合并之后然后判断的.并且鉴于题目 ...
- POJ 1417 True Liars (种类并查集+DP)
题目:True Liars 题目大意:给出n对关系,p1个好人,p2个坏人.要求根据n对关系中找出好人有哪些,若方案唯一,则逐个输出好人,最后输出end:若方案不唯一/找不到,那么输出no 结论:通过 ...
- POJ 1417 True Liars 带权并查集 + 背包
一.内容 After having drifted about in a small boat for a couple of days, Akira Crusoe Maeda was finally ...
- POJ 1417 True Liars(带权并查集+DP)
传送门 Description After having drifted about in a small boat for a couple of days, Akira Crusoe Maeda ...
- POJ - 1417(True Liars)
题意:雾岛上有两个部落,天使部落有 p1 个人,他们只说真话,恶魔部落有 p2 个人,他们只说假话,但是两个部落的人长得一模一样,把这 p1+p2 个人从1编号,然后有 n 次询问,每次询问给出 a ...
- POJ - 1417 True Liars POJ - 141 带权并查集,01背包问题
题目链接 POJ-1417 题意 岛上有说真话的好人和说假话的坏人,给你这两种人的人数.再给出q次问答结果,问答的格式是向a询问b是否是好人,回答是yes或者no.问是否可以分辨出全部好人,是的话打印 ...
- C - BLG POJ - 1417 种类并查集加dp(背包)
思路:刚看这道题感觉什么都不清楚,人物之间的关系一点也看不出来,都不知道怎么写,连并查集都没看出来,但是你可以仔细分析一下,当输入字符串为"yes"的时候,我们设输入的值为x和y, ...
- POJ1417 True Liars ——种类并查集+01背包+路径** 好题
POJ1417 题意: 有n行输入形如x, y, str,str为yes表示x说y是天使,str为no表示x说y不是天使(x, y为天使,恶魔的编号,1<=x,y<=p+q): ...
最新文章
- 现金奖励+实习offer!数据库大赛来了
- linux 安装软件出现/tmp 磁盘不足时 解决方案
- c# winForm DotNetBar控件之SuperGridControl
- android中px单位,android中像素单位dp、px、pt、sp的比较
- 【Git】Git教程
- 需求管理工具比较 Doors_Requistie Pro_RDM
- [攻防世界 pwn]——cgpwn2
- ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成
- 360浏览器打不开qq空间_360浏览器打不开? 60浏览器打不开网页的处理方法(图文)...
- 【机器学习-西瓜书】三、逻辑回归(LR);线性判别分析(LDA)
- GPG软件签名与验证
- MockingBrid(AI拟声)教程
- 【视频编码】【Vue】【明星开源项目】| Chat · 预告
- 全国书画艺术之乡-----通渭
- android 方向传感器,10.11 传感器专题(2)——方向传感器
- czl蒻蒟的OI之路6
- 汇丰银行出售美国加州零售业务分行;拜耳与阿里健康将在多个领域开展深度合作 | 美通企业日报...
- 未来计算机的发展英文文章,计算机的现状和未来计算机发展(The status quo of computers and future computer development).doc...
- java反射中method类中的invoke方法是做什么的,他有什么作用?
- Bugly 多渠道热更新解决方案