1326: The contest(并查集+分组背包)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326
殷犇有很多队员。他们都认为自己是最强的,于是,一场比赛开始了~
于是安叔主办了一场比赛,比赛有n个题目,每个题目都有一个价值Pi和相对能力消耗Wi,但是有些题目因为太坑不能同时做出来,并且坑题具有传递性。(a和b一起做会坑、b和c会坑则a和c也会坑) ACM队员们想知道,于是他们想知道在能力范围内,它们最多可以作出多少价值的题目。
聪明的你,告诉我,能帮帮他们吗?
Input
第1行两个整数,n,Wmax,k(0<=n,Wmax,k<=1000),其中n为题目总数,Wmax为初始的总能力数.
接下来n行,为每个题目的Pi,Wi(0<=Pi<=1000,1<=Wi<=10,均为整数)
再接下来k行,每行2个数字a,b表示a和b会坑
Output
对每组数据输出1行为最大可能价值
Sample Input
3 10 1
100 1
200 5
10 5
1 2
Sample Output
210
思路:刚开始陷入误区了,以为会只有一个树将所有的坑题链接起来,这样就只需考虑动态转移就好,wa了几次之后,再去看题,突然间发现,好像并查集过去之后是可以有多颗树的,那么这些树里面最多可以取一个,不在这些树里面的,随意取,于是改改就ac了
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
int father[10000];
int dp[2000],s[2000][3];
int path[1005][1005],f[1005];
int t[1005];
int find(int x)
{
int root,i=x;
while(father[x]!=x)
x=father[x];
root=x;
while(father[i]!=root)
{
int tmp=father[i];
father[i]=root;
i=tmp;
}
return root;
}
void liantong(int x,int y)
{
x=find(x);
y=find(y);
father[x]=y;
}
int main()
{
int n,ans,k;
while(scanf("%d%d%d",&n,&ans,&k)!=EOF)
{
memset(dp,0,sizeof(dp));
//memset(p,0,sizeof(p));
memset(f,0,sizeof(f));
for(int i=0;i<=n;i++)
father[i]=i;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&s[i][0],&s[i][1]);
s[i][2]=i;
}
for(int i=1;i<=k;i++)
{
int tmp,tmp1;
scanf("%d%d",&tmp,&tmp1);
tmp=find(tmp);
tmp1=find(tmp1);
if(tmp!=tmp1)
liantong(tmp,tmp1);
}
for(int i=1;i<=n;i++)
{
int tmp=find(i);
path[tmp][f[tmp]++]=i;
//printf("%d\n",tmp);
}
int cnt=1;
for(int i=1;i<=n;i++)
{
if(f[i]==1)
{
t[cnt++]=i;
//printf("%d\n",i);
}
}
for(int i=1;i<=n;i++)
{
if(f[i]==1||f[i]==0)
continue;
for(int j=ans;j>=0;j--)
{
for(int iter=0;iter<f[i];iter++)
{
int tmp=path[i][iter];
if(j-s[tmp][1]>=0)
{
if(dp[j]<dp[j-s[tmp][1]]+s[tmp][0])
dp[j]=dp[j-s[tmp][1]]+s[tmp][0];
}
}
}
}
for(int i=1;i<cnt;i++)
{
int tmp=t[i];
for(int j=ans;j>=s[tmp][1];j--)
{
if(dp[j]<dp[j-s[tmp][1]]+s[tmp][0])
dp[j]=dp[j-s[tmp][1]]+s[tmp][0];
}
}
printf("%d\n",dp[ans]);
}
return 0;
}
1326: The contest(并查集+分组背包)的更多相关文章
- Codeforces Round #383 (Div. 2) A,B,C,D 循环节,标记,暴力,并查集+分组背包
A. Arpa’s hard exam and Mehrdad’s naive cheat time limit per test 1 second memory limit per test 256 ...
- CSU 1326:The contest(并查集+分组背包)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326 题意:…… 思路:并查集建图处理出边,然后分组背包. 之前不会分组背包,比赛的时候也推不出来 ...
- Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses (并查集+分组背包)
<题目链接> 题目大意: 就是有n个人,每个人都有一个体积和一个价值.这些人之间有有些人之间是朋友,所有具有朋友关系的人构成一组.现在要在这些组中至多选一个人或者这一组的人都选,在总容量为 ...
- Codeforce 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses(并查集&分组背包)
题意: 给定n个价值为b 花费为w的物品, 然后某些物品是属于同一个组的, 给定一个花费限制V, 求在小于等于V的情况下取得到的价值最大为多少,能对于同一个组的物品,要么全取,要么只取一个. 分析: ...
- codevs 3372 选学霸(hash+并查集+多重背包)
先通过并查集处理出来有多少种不同的集合,每一个集合有多少人.一定要不要忘记了与别的没有联系的独立点. 并查集的时候能够通过hash处理出来每一个数目同样的集合的个数. 这样以人数为权值.个数为限制进行 ...
- hdu 6795 Little W and Contest 并查集+排列组合
题意: t组输入,有n个人,刚开始谁也不认识谁.每一个人有一个权值w[i](1<=w[i]<=2),你要挑选3个互相不认识的人组成一个队,且要保证3个人权值之和大于等于5(也就意味着最少要 ...
- P1455 搭配购买 (并查集+01背包)
[题目描述] 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵 ...
- 并查集+背包 【CF741B】 Arpa's weak amphitheater and Mehrdad's valuable Hoses
Descirption 有n个人,每个人都有颜值bi与体重wi.剧场的容量为W.有m条关系,xi与yi表示xi和yi是好朋友,在一个小组. 每个小组要么全部参加舞会,要么参加人数不能超过1人. 问保证 ...
- csu 1326 The contest
裸的 并查集 + 分组背包: #include<iostream> #include<cstring> #include<algorithm> #inclu ...
随机推荐
- 【SPSS】软件介绍
SPSS软件是美国斯坦福大学三位学生1968年研制开发的统计软件,SPSS是Statistical Package for Social Science(社会科学软件统计包)的缩写,2000年SPSS ...
- jquery实现下拉联动
很多项目用到这个功能,虽然写了不下5次以上了,一直没做过记录,记录一下,下次直接拷贝了,免得还得要重复写浪费时间. 先上HTML代码: 品牌: <select class="sa&qu ...
- 函数式编程工具:filter和reduce
# -*- coding: utf-8 -*- #python 27 #xiaodeng #函数式编程工具:filter和reduce #python内置函数中,map函数是用来进行函数式编程这类工具 ...
- TP3.2实例化复杂模型类
1.表名:xxf_witkey_member_oauth M方法,直接实例化对象:M('member_oauth','xxf_witkey_'[,'db_config']); 具体解析:M方法三个参数 ...
- java多线程(一)之继承Thread类
一.概述 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 二.两种实现方式, 下面为第一种方式: 继承Thread类 ...
- cxf之GET,POST,PUT,DELETE的区别
GET,POST,PUT,DELETE的区别 注意: 文中有错误地方:关于增改删查正确的描述应为: get对应的是查询post对应的是保存/增加delete对应的是删除put对应的是更新
- HDUOJ---(1995)汉诺塔V
汉诺塔V Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- eclipse svn登陆用户保存信息删除
win7系统 eclipse svn saveinfo path:磁盘:\%用户名%\AppData\Roaming\Subversion\auth\svn.simple 例如:D:\Users\用户 ...
- PC上的番茄工作法软件 Pomodairo 1.9 详细攻略
http://www.zhantuo.com/archives/673155 番茄钟软件 Pomodairo 1.9: 我觉得这款软件特别好,完全符合番茄工作法的要求. 你可以通过add new 来增 ...
- 浅析若干Java序列化工具【转】
在Java中socket传输数据时,数据类型往往比较难选择.可能要考虑带宽.跨语言.版本的兼容等问题.比较常见的做法有: 采用java对象的序列化和反序列化 把对象包装成JSON字符串传输 Googl ...