poj1417 带权并查集 + 背包 + 记录路径
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 2713 | Accepted: 868 |
Description
In order to prevent the worst-case scenario, Akira should distinguish the devilish from the divine. But how? They looked exactly alike and he could not distinguish one from the other solely by their appearances. He still had his last hope, however. The members of the divine tribe are truth-tellers, that is, they always tell the truth and those of the devilish tribe are liars, that is, they always tell a lie.
He asked some of them whether or not some are divine. They knew one another very much and always responded to him "faithfully" according to their individual natures (i.e., they always tell the truth or always a lie). He did not dare to ask any other forms of questions, since the legend says that a devilish member would curse a person forever when he did not like the question. He had another piece of useful informationf the legend tells the populations of both tribes. These numbers in the legend are trustworthy since everyone living on this island is immortal and none have ever been born at least these millennia.
You are a good computer programmer and so requested to help Akira by writing a program that classifies the inhabitants according to their answers to his inquiries.
Input
n p1 p2
xl yl a1
x2 y2 a2
...
xi yi ai
...
xn yn an
The first line has three non-negative integers n, p1, and p2. n is the number of questions Akira asked. pl and p2 are the populations of the divine and devilish tribes, respectively, in the legend. Each of the following n lines has two integers xi, yi and one word ai. xi and yi are the identification numbers of inhabitants, each of which is between 1 and p1 + p2, inclusive. ai is either yes, if the inhabitant xi said that the inhabitant yi was a member of the divine tribe, or no, otherwise. Note that xi and yi can be the same number since "are you a member of the divine tribe?" is a valid question. Note also that two lines may have the same x's and y's since Akira was very upset and might have asked the same question to the same one more than once.
You may assume that n is less than 1000 and that p1 and p2 are less than 300. A line with three zeros, i.e., 0 0 0, represents the end of the input. You can assume that each data set is consistent and no contradictory answers are included.
Output
Sample Input
2 1 1
1 2 no
2 1 no
3 2 1
1 1 yes
2 2 yes
3 3 yes
2 2 1
1 2 yes
2 3 no
5 4 3
1 2 yes
1 3 no
4 5 yes
5 6 yes
6 7 no
0 0 0
Sample Output
no
1
2
end
3
4
5
6
end
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<string>
#include<time.h>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 1000000001
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int MAXN = ;
int pa[MAXN],n,p1,p2,rel[MAXN],vis[MAXN];
vector<int>b[MAXN][];
int a[MAXN][],dp[MAXN][MAXN],pre[MAXN][MAXN];
void Init()
{
for(int i = ; i <= p1 + p2; i++){
pa[i] = i;
b[i][].clear();
b[i][].clear();
a[i][] = ;
a[i][] = ;
}
memset(rel,,sizeof(rel));
}
int find(int x)
{
if(x != pa[x]){
int fx = find(pa[x]);
rel[x] = (rel[x] + rel[pa[x]]) % ;
pa[x] = fx;
}
return pa[x];
}
int main()
{
while(~scanf("%d%d%d",&n,&p1,&p2)){
if(!n && !p1 && !p2)break;
Init();
int x,y,z;
char s[];
for(int i = ; i < n; i++){
scanf("%d %d %s",&x,&y,s);
if(s[] == 'y'){
z = ;
}
else {
z = ;
}
int fx = find(x);
int fy = find(y);
if(fx != fy){
pa[fx] = fy;
rel[fx] = ( - rel[x] + z + rel[y]) % ;
}
}
memset(vis,,sizeof(vis));
int cnt = ;
for(int i = ; i <= p1 + p2; i++){
if(!vis[i]){
int tp = find(i);
for(int j = i; j <= p1 + p2; j++){
int fp = find(j);
if(fp == tp){
vis[j] = ;
b[cnt][rel[j]].push_back(j);
a[cnt][rel[j]] ++;
}
}
//cout<<a[cnt][0]<<' '<<a[cnt][1]<<endl;
cnt ++;
}
}
memset(vis,,sizeof(vis));
memset(dp,,sizeof(dp));
dp[][] = ;
for(int i = ; i < cnt; i++){
for(int j = p1; j >= ; j--){
if(j - a[i][] >= && dp[i-][j - a[i][]]){
dp[i][j] += dp[i-][j-a[i][]];
pre[i][j] = j - a[i][];
}
if(j - a[i][] >= && dp[i-][j - a[i][]]){
dp[i][j] += dp[i-][j-a[i][]];
pre[i][j] = j - a[i][];
}
}
}
if(dp[cnt-][p1] != ){
printf("no\n");
}
else {
vector<int>ans;
int l = p1;
for(int i = cnt - ; i >= ; i--){
int tp = l - pre[i][l];
if(tp == a[i][]){
for(int j = ; j < b[i][].size(); j++){
ans.push_back(b[i][][j]);
}
}
else {
for(int j = ; j < b[i][].size(); j++){
ans.push_back(b[i][][j]);
}
}
l = pre[i][l];
}
sort(ans.begin(),ans.end());
for(int i = ; i < ans.size(); i++){
printf("%d\n",ans[i]);
}
printf("end\n");
}
}
return ;
}
poj1417 带权并查集 + 背包 + 记录路径的更多相关文章
- poj1417(带权并查集+背包DP+路径回溯)
题目链接:http://poj.org/problem;jsessionid=8C1721AF1C7E94E125535692CDB6216C?id=1417 题意:有p1个天使,p2个恶魔,天使只说 ...
- poj1417 带权并查集+0/1背包
题意:有一个岛上住着一些神和魔,并且已知神和魔的数量,现在已知神总是说真话,魔总是说假话,有 n 个询问,问某个神或魔(身份未知),问题是问某个是神还是魔,根据他们的回答,问是否能够确定哪些是神哪些是 ...
- 西安邀请赛-D(带权并查集+背包)
题目链接:https://nanti.jisuanke.com/t/39271 题意:给定n个物品,m组限制,每个物品有个伤害值,现在让两个人取完所有物品,要使得两个人取得物品伤害值之和最接近,输出伤 ...
- 洛谷P1196 [NOI2002]银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
- [NOIP摸你赛]Hzwer的陨石(带权并查集)
题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...
- 【BZOJ-4690】Never Wait For Weights 带权并查集
4690: Never Wait for Weights Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 88 Solved: 41[Submit][ ...
- hdu 1829-A Bug's LIfe(简单带权并查集)
题意:Bug有两种性别,异性之间才交往, 让你根据数据判断是否存在同性恋,输入有 t 组数据,每组数据给出bug数量n, 和关系数m, 以下m行给出相交往的一对Bug编号 a, b.只需要判断有没有, ...
- POJ 2912 Rochambeau(难,好题,枚举+带权并查集)
下面的是从该网站上copy过来的,稍微改了一点,给出链接:http://hi.baidu.com/nondes/item/26dd0f1a02b1e0ef5f53b1c7 题意:有N个人玩剪刀石头布, ...
随机推荐
- Vijos1451圆环取数[环形DP|区间DP]
背景 小K攒足了路费来到了教主所在的宫殿门前,但是当小K要进去的时候,却发现了要与教主守护者进行一个特殊的游戏,只有取到了最大值才能进去Orz教主…… 描述 守护者拿出被划分为n个格子的一个圆环,每个 ...
- Hibernate关联映射关系
Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...
- document对象补充
五.相关元素操作: var a = document.getElementById("id"); 找到a: var b = a.nextSibling ...
- Android中关于Volley的使用(五)从RequestQueue开始来深入认识Volley
在前面的几篇文章中,我们学习了如何用Volley去网络加载JSON数据,如何利用ImageRequest和NetworkImageView去网络加载数据,而关于Volley的使用,我们都是从下面一行代 ...
- RecyclerView,CardView导入和使用(Demo)
简介: 这篇文章是ANDROID L——Material Design详解(UI控件)的一个补充或者说是应用实例,如果有时间建议大家稍微浏览一下上篇文章. 本文主要介绍Android L新增加的两个U ...
- AppStore 上架注意事项及错误修改
1.上架之前首页要配置好发布证书,配置用于发布的配置文件. 2.必须上传3.5英寸和4英寸图片,这两种图片尺寸不能缺. 3.提交的版本必须是在8.0及以上的版本. 4.必须用发布证书,如果提示UUID ...
- iOS中NSScanner 的用法
NSScanner是一个类,用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串.可以创建NSScanner时制定他的String属性,然后scanner会按照你的要求从头到尾扫描这 ...
- php中的ip2long和long2ip的理解
IPv4地址是如何表示的 IPv4使用无符号32位地址,因此最多有2的32次方减1(4294967295)个地址.一般的书写法为用4个小数点分开的十进制数,记为:A.B.C.D,比如:157.23.5 ...
- Standard Error of Mean(s.e.m.)
· 来源:http://www.dxy.cn/bbs/thread/6492633#6492633 6楼: “据我所知,SD( standard deviation )反应的是观测值的变异性,其表示平 ...
- JavaScript继承与原型链
对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...