通过读题,容易发现,当回答为yes时 \(x,y\) 必属于同类,当回答为no时二者必为异类(并且当 \(x=y\) 时,回答必为yes,不过这题不用这个性质)。

于是先按关系维护连通块,然后求出每个连通块的人数,用背包看是否能够凑出。可以把一个连通块的看作一个物品,总共的天神数就是背包的容量。

还用了set辅助维护每个连通块里具体是哪些人。

这道题刚开始一直卡着,结果照着样例手玩一遍就全懂了,所以光空想还是不行的。

具体看丑陋的代码吧……

#include <bits/stdc++.h>
using namespace std; const int N=1005,M=605;
struct path{int r1,r2,rd1,rd2;}p[M];
set<int> s[M<<1];
int fa[M<<1],n,m,p1,p2,d[M<<1],f[M][M]; int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
void merge(int x,int y) {fa[find(x)]=find(y);} int main()
{
while(~scanf("%d%d%d",&n,&p1,&p2)&&(n||p1||p2))
{
m=p1+p2;
for(int i=1;i<=m+m;++i) fa[i]=i,s[i].clear();
for(int i=1,x,y;i<=n;++i)
{
char s[5];
scanf("%d %d %s",&x,&y,s);
if(s[0]=='y') merge(x,y),merge(x+m,y+m);
else merge(x,y+m),merge(x+m,y);
}
memset(d,0,sizeof(d));
for(int i=1;i<=m;++i)
{
int x=find(i);
d[x]++; s[x].insert(i);
}
int cnt=0;
for(int i=1;i<=m+m;++i)
{
if(!d[i]) continue;
int x=i<=m?i:i-m;int y=x+m;
x=find(x),y=find(y);
p[++cnt].r1=d[x];
p[cnt].r2=d[y];
p[cnt].rd1=x,p[cnt].rd2=y;
d[x]=d[y]=0;
}
memset(f,0,sizeof(f));
f[0][0]=1;
for(int i=1;i<=cnt;++i)
for(int j=p1;~j;--j)
{
if(j>=p[i].r1) f[i][j]+=f[i-1][j-p[i].r1];
if(j>=p[i].r2) f[i][j]+=f[i-1][j-p[i].r2];
}
if(f[cnt][p1]!=1) puts("no");
else
{
set<int> ans; int sum=p1;
for(int i=cnt;i;--i)
if(f[i-1][sum-p[i].r1])
ans.insert(s[p[i].rd1].begin(),s[p[i].rd1].end()),sum-=p[i].r1;
else ans.insert(s[p[i].rd2].begin(),s[p[i].rd2].end()),sum-=p[i].r2;
for(int i : ans) printf("%d\n",i);
puts("end");
}
}
return 0;
}

POJ1417 True Liars 题解的更多相关文章

  1. POJ1417 True Liars

    题意 Language:Default True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6392 Accep ...

  2. POJ1417:True Liars(DP+带权并查集)

    True Liars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. POJ1417 True Liars —— 并查集 + DP

    题目链接:http://poj.org/problem?id=1417 True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  4. POJ1417 True Liars 并查集 动态规划 (种类并查集)

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ1417 题意概括 有一群人,p1个好人,p2个坏人. 他们说了n句话.(p1+p2<=600,n ...

  5. poj1417 true liars(并查集 + DP)详解

    这个题做了两天了.首先用并查集分类是明白的, 不过判断是否情况唯一刚开始用的是搜索.总是超时. 后来看别人的结题报告, 才恍然大悟判断唯一得用DP. 题目大意: 一共有p1+p2个人,分成两组,一组p ...

  6. poj1417 True Liars[并查集+背包]

    有一点小转化的题,在设计dp状态时还是有点费脑筋的. 地址. 依题意,首先可以知道肯定要扩展域的并查集(明摆着的嘛).一个"好人"域,一个"坏人"域,每句话分两 ...

  7. True Liars POJ - 1417

    True Liars After having drifted about in a small boat for a couple of days, Akira Crusoe Maeda was f ...

  8. 【POJ1417】【带标记并查集+DP】True Liars

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

  9. F - True Liars - poj1417(背包+并查集)

    题意:有这么一群人,一群好人,和一群坏人,好人永远会说实话,坏人永远说假话,现在给你一组对话和好人与坏人的数目P1, P2. 数据里面的no是A说B是坏人, yes代表A说B是好人,就是这样,问题能不 ...

随机推荐

  1. Django(62)自定义认证类

    前言 如果我们不用使用drf那套认证规则,我们想自定义认证类,那么我们首先要知道,drf本身是如何定义认证规则的,也就是要查看它的源码是如何写的 源码分析 源码的入口在APIView.py文件下的di ...

  2. Redis 性能问题分析

    在一些网络服务的系统中,Redis 的性能,可能是比 MySQL 等硬盘数据库的性能更重要的课题.比如微博,把热点微博[1],最新的用户关系,都存储在 Redis 中,大量的查询击中 Redis,而不 ...

  3. Nginx为什么快到根本停不下来?

    Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器. 图片来自 Pexels Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资 ...

  4. EVB_Air724UG_A13开发板使用指南

      Air724 是上海合宙物联网于2020年3月下旬发布的一款基于UIS8910DM芯片组的物联网通讯模块. 模块通讯性能优越,符合Cat1通讯标准,支持最大下行速率 10Mbps 和最大上行速率5 ...

  5. 散列数据结构以及在HashMap中的应用

    1. 为什么需要散列表? 对于线性表和链表而言,访问表中的元素,时间复杂度均为O(n).即便是通过树结构存储数据,时间复杂度也为O(logn).那么有没有一种方式可以将这个时间复杂度降为O(1)呢?当 ...

  6. python 字典和列表嵌套用法

    python中字典和列表的使用,在数据处理中应该是最常用的,这两个熟练后基本可以应付大部分场景了.不过网上的基础教程只告诉你列表.字典是什么,如何使用,很少做组合说明. 刚好工作中采集promethe ...

  7. SpringCloud 微服务最佳开发实践

    Maven规范 所有项目必须要有一个统一的parent模块 所有微服务工程都依赖这个parent,parent用于管理依赖版本,maven仓库,jar版本的统一升级维护 在parent下层可以有 co ...

  8. .Net Core with 微服务 - Consul 配置中心

    上一次我们介绍了Elastic APM组件.这一次我们继续介绍微服务相关组件配置中心的使用方法.本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大,还是让我爱不起来.因为 ...

  9. python 正则表达式 中级

    1.子表达式 将几个字符的组合形式看做一个大的字符,例如匹配IP地址,形如 127.0.0.1 答案一:p1='\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' pattern1 ...

  10. WPF教程六:理解WPF中的隧道路由和冒泡路由事件

    WPF中使用路由事件升级了传统应用开发中的事件,在WPF中使用路由事件能更好的处理事件相关的逻辑,我们从这篇开始整理事件的用法和什么是直接路由,什么是冒泡路由,以及什么是隧道路由. 事件最基本的用法 ...