[题目链接]

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相关推荐

  1. POJ 1417 True Liars(路径压缩并查集+DP背包问题)

    POJ 1417 True Liars(路径压缩并查集+DP背包问题) http://poj.org/problem?id=1417 题意: 给出p1+p2个人,其中p1个是好人,p2个是坏人.然后有 ...

  2. POJ 1417 True Liars 并查集+背包

    题目链接:http://poj.org/problem?id=1417 解题思路:比较容易想到的是并查集,然后把第三组数据测试一下之后发现这并不是简单的并查集,而是需要合并之后然后判断的.并且鉴于题目 ...

  3. POJ 1417 True Liars (种类并查集+DP)

    题目:True Liars 题目大意:给出n对关系,p1个好人,p2个坏人.要求根据n对关系中找出好人有哪些,若方案唯一,则逐个输出好人,最后输出end:若方案不唯一/找不到,那么输出no 结论:通过 ...

  4. POJ 1417 True Liars 带权并查集 + 背包

    一.内容 After having drifted about in a small boat for a couple of days, Akira Crusoe Maeda was finally ...

  5. POJ 1417 True Liars(带权并查集+DP)

    传送门 Description After having drifted about in a small boat for a couple of days, Akira Crusoe Maeda ...

  6. POJ - 1417(True Liars)

    题意:雾岛上有两个部落,天使部落有 p1 个人,他们只说真话,恶魔部落有 p2 个人,他们只说假话,但是两个部落的人长得一模一样,把这 p1+p2 个人从1编号,然后有 n 次询问,每次询问给出 a ...

  7. POJ - 1417 True Liars POJ - 141 带权并查集,01背包问题

    题目链接 POJ-1417 题意 岛上有说真话的好人和说假话的坏人,给你这两种人的人数.再给出q次问答结果,问答的格式是向a询问b是否是好人,回答是yes或者no.问是否可以分辨出全部好人,是的话打印 ...

  8. C - BLG POJ - 1417 种类并查集加dp(背包)

    思路:刚看这道题感觉什么都不清楚,人物之间的关系一点也看不出来,都不知道怎么写,连并查集都没看出来,但是你可以仔细分析一下,当输入字符串为"yes"的时候,我们设输入的值为x和y, ...

  9. POJ1417 True Liars ——种类并查集+01背包+路径** 好题

    ​​​​​​POJ1417 题意: 有n行输入形如x, y, str,str为yes表示x说y是天使,str为no表示x说y不是天使(x, y为天使,恶魔的编号,1<=x,y<=p+q): ...

最新文章

  1. 现金奖励+实习offer!数据库大赛来了
  2. linux 安装软件出现/tmp 磁盘不足时 解决方案
  3. c# winForm DotNetBar控件之SuperGridControl
  4. android中px单位,android中像素单位dp、px、pt、sp的比较
  5. 【Git】Git教程
  6. 需求管理工具比较 Doors_Requistie Pro_RDM
  7. [攻防世界 pwn]——cgpwn2
  8. ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成
  9. 360浏览器打不开qq空间_360浏览器打不开? 60浏览器打不开网页的处理方法(图文)...
  10. 【机器学习-西瓜书】三、逻辑回归(LR);线性判别分析(LDA)
  11. GPG软件签名与验证
  12. MockingBrid(AI拟声)教程
  13. 【视频编码】【Vue】【明星开源项目】| Chat · 预告
  14. 全国书画艺术之乡-----通渭
  15. android 方向传感器,10.11 传感器专题(2)——方向传感器
  16. czl蒻蒟的OI之路6
  17. 汇丰银行出售美国加州零售业务分行;拜耳与阿里健康将在多个领域开展深度合作 | 美通企业日报...
  18. 未来计算机的发展英文文章,计算机的现状和未来计算机发展(The status quo of computers and future computer development).doc...
  19. java反射中method类中的invoke方法是做什么的,他有什么作用?
  20. Bugly 多渠道热更新解决方案

热门文章

  1. 量化交易之图形选股指标:曙光初现
  2. 信息熵的理解及推导过程
  3. 单电子双缝干涉的猜测:跃迁与反粒子
  4. 记一下自行安装RabbitMQ的步骤
  5. linux查看某个文件夹的大小(ls命令、du命令详解)
  6. 双系统Ubuntu 引导修复(Boot Repair)
  7. 人类技术变革史——人类历史上的技术变革和影响
  8. ZOJ 3228 Searching the String (AC自动机)
  9. java实现等腰三角形星字塔
  10. [图形学] Hair Simulation in TressFX(头发模拟)