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 ...
随机推荐
- 配置的好的Apache和PHP语言的环境下,如何在Apache目录下htdocs/html目录下 同时部署两个项目呢
建虚拟目录打开Apache->conf->httpd.conf在最下面粘贴NameVirtualHost 127.0.0.1 <VirtualHost 127.0.0.1> S ...
- 数据存储的两种方式:Cookie 和Web Storage
数据存储的两种方式:Cookie 和Web Storage 1.Cookie Cookie的作用就像你去超市购物时,第一次给你办张购物卡,这个购物卡里存放了一些你的个人信息,下次你再来这个连锁超市时, ...
- python学习笔记——multiprocessing 多进程组件 Pipe管道
进程间通信(IPC InterProcess Communication)是值在不同进程间传播或交换信息. IPC通过有管道(无名管道 和 有名 / 命名管道).消息队列.共享存储 / 内容.信号量. ...
- PLSQL_通过UTL_MAIL发送并发程式结果报表至用户邮箱(案例)
2014-06-01 Created By BaoXinjian
- Python 字典 pop() 方法
描述 Python 字典 pop() 方法删除给定键所对应的键/值对,并返回被删除的值.给定键如果不在字典中,则必须设置一个default值,否则会报错,此时返回的就是default值. 语法 pop ...
- Python lower() 方法
描述 Python lower() 方法转换字符串中所有大写字符为小写,其效果和 casefold() 方法非常相似. 两者的区别是:lower() 方法只对ASCII编码,也就是‘A-Z’有效,对于 ...
- ES6 class setTimeout promise async/await 测试Demo
class Person { async getVersion () { return new Promise((resolve, reject) => { setTimeout(functio ...
- shell case语法
在阅读hadoop相关的脚本文件时,遇到case语句,好久不写shell,忘了不少,复习下shell的case语句: 运行结果: ...
- RUBY Error: Please update your PATH to include build tools or download the DevKit
出错的原因是安装XXXXX的时候,需要build tools,但系统中没有.出错信息中同时也给出了解决的法案: 1. 到 http://rubyinstaller.org/downloads/ 去下载 ...
- 使用 bat cmd命令杀掉 删掉运行的程序
删掉所有xx.exe开启的进程 taskkill /f /im xx.exe 开启xx.exe start xx.exe 根据标题栏信息删除 taskkill /f /FI "windows ...