POJ1417 True Liars 题解
通过读题,容易发现,当回答为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 题解的更多相关文章
- POJ1417 True Liars
题意 Language:Default True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6392 Accep ...
- POJ1417:True Liars(DP+带权并查集)
True Liars Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- POJ1417 True Liars —— 并查集 + DP
题目链接:http://poj.org/problem?id=1417 True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- POJ1417 True Liars 并查集 动态规划 (种类并查集)
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ1417 题意概括 有一群人,p1个好人,p2个坏人. 他们说了n句话.(p1+p2<=600,n ...
- poj1417 true liars(并查集 + DP)详解
这个题做了两天了.首先用并查集分类是明白的, 不过判断是否情况唯一刚开始用的是搜索.总是超时. 后来看别人的结题报告, 才恍然大悟判断唯一得用DP. 题目大意: 一共有p1+p2个人,分成两组,一组p ...
- poj1417 True Liars[并查集+背包]
有一点小转化的题,在设计dp状态时还是有点费脑筋的. 地址. 依题意,首先可以知道肯定要扩展域的并查集(明摆着的嘛).一个"好人"域,一个"坏人"域,每句话分两 ...
- True Liars POJ - 1417
True Liars After having drifted about in a small boat for a couple of days, Akira Crusoe Maeda was f ...
- 【POJ1417】【带标记并查集+DP】True Liars
Description After having drifted about in a small boat for a couple of days, Akira Crusoe Maeda was ...
- F - True Liars - poj1417(背包+并查集)
题意:有这么一群人,一群好人,和一群坏人,好人永远会说实话,坏人永远说假话,现在给你一组对话和好人与坏人的数目P1, P2. 数据里面的no是A说B是坏人, yes代表A说B是好人,就是这样,问题能不 ...
随机推荐
- Django(60)Django内置User模型源码分析及自定义User
前言 Django为我们提供了内置的User模型,不需要我们再额外定义用户模型,建立用户体系了.它的完整的路径是在django.contrib.auth.models.User. User模型源码分析 ...
- 十一、diff和patch打补丁
diff制作补丁文件的原理:告诉我们怎么修改第一个文件后能得到第二个文件. diff命令常用选项: -u 输出统一内容的头部信息(打补丁使用),计算机知道是哪个文件需要修改 -r 递归对比目录中 ...
- 【NX二次开发】Block UI 双精度表
属性说明 常规 类型 描述 BlockID String 控件ID Enable Logical 是否可操作 Group Logical ...
- jdk,jre.jvm三者的关系
jdk>jre>jvm jdk=jre+java的开发工具(包括java.exe,javac.exe.javadoc.exe) jre=jvm+java核心类库
- 小白学k8s(7)helm[v3]使用了解
helm使用 什么是helm 安装helm Helm V2 & V3 架构设计 配置kube config helm使用 添加仓库 helm安装nginx helm的核心概念 Chart Co ...
- 在线博客转PDF电子书 | JS爬虫初探
最近在看一位大佬写的源码解析博客,平时上下班用手机看不太得劲,但是平板又没有网卡,所以就想搞个离线pdf版,方便通勤时间学习阅读. 所以,问题来了: 怎么把在线网页内容转成pdf? 这位大佬的博客是用 ...
- 跟着官方文档学Maven构建生命周期
在IntelliJ IDEA中,显示了Maven的Lifecycle: 只需要学习这些命令,就能构建一个Maven项目. 三个内置生命周期 Maven内置了三个生命周期:clean.default和s ...
- Netty 框架学习 —— 预置的 ChannelHandler 和编解码器
Netty 为许多提供了许多预置的编解码器和处理器,几乎可以开箱即用,减少了在烦琐事务上话费的时间和精力 空闲的连接和超时 检测空闲连接以及超时对于释放资源来说至关重要,Netty 特地为它提供了几个 ...
- 什么IP欺骗?
1.什么是IP欺骗? IP欺骗是指创建源地址经过修改的Internet协议(IP) 数据包,目的要么是隐藏发送方的身份,要么是冒充其他计算机系统,或者两者兼具.恶意用户往往采用这项技术对目标设备或周边 ...
- pip安装setuptools_rust报错
公司项目中有主备CDN存在,由于阿里云以及腾讯云的预热功能不支持自动(一般是云函数),所以就根据云厂商给的脚本稍作更改,手动传入数据来进行预热. 由于之前部署在centos7.7系统python2.7 ...