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(并查集+分组背包)的更多相关文章

  1. 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 ...

  2. CSU 1326:The contest(并查集+分组背包)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326 题意:…… 思路:并查集建图处理出边,然后分组背包. 之前不会分组背包,比赛的时候也推不出来 ...

  3. Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses (并查集+分组背包)

    <题目链接> 题目大意: 就是有n个人,每个人都有一个体积和一个价值.这些人之间有有些人之间是朋友,所有具有朋友关系的人构成一组.现在要在这些组中至多选一个人或者这一组的人都选,在总容量为 ...

  4. Codeforce 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses(并查集&分组背包)

    题意: 给定n个价值为b 花费为w的物品, 然后某些物品是属于同一个组的, 给定一个花费限制V, 求在小于等于V的情况下取得到的价值最大为多少,能对于同一个组的物品,要么全取,要么只取一个. 分析: ...

  5. codevs 3372 选学霸(hash+并查集+多重背包)

    先通过并查集处理出来有多少种不同的集合,每一个集合有多少人.一定要不要忘记了与别的没有联系的独立点. 并查集的时候能够通过hash处理出来每一个数目同样的集合的个数. 这样以人数为权值.个数为限制进行 ...

  6. hdu 6795 Little W and Contest 并查集+排列组合

    题意: t组输入,有n个人,刚开始谁也不认识谁.每一个人有一个权值w[i](1<=w[i]<=2),你要挑选3个互相不认识的人组成一个队,且要保证3个人权值之和大于等于5(也就意味着最少要 ...

  7. P1455 搭配购买 (并查集+01背包)

    [题目描述] 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵 ...

  8. 并查集+背包 【CF741B】 Arpa's weak amphitheater and Mehrdad's valuable Hoses

    Descirption 有n个人,每个人都有颜值bi与体重wi.剧场的容量为W.有m条关系,xi与yi表示xi和yi是好朋友,在一个小组. 每个小组要么全部参加舞会,要么参加人数不能超过1人. 问保证 ...

  9. csu 1326 The contest

    裸的   并查集  +  分组背包: #include<iostream> #include<cstring> #include<algorithm> #inclu ...

随机推荐

  1. 【Linux】在Linux上查看并替换特殊字符

    现有windows上新建的一个txt文件file01.txt,内容如下: 我们通过ftp上传到Linux,在Linux下使用命令cat –A file01.txt查看文件内容发现该文件的结尾全是^M$ ...

  2. str.format格式化用法(通过{}来替代%)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #str.format格式化用法(通过{}来替代%) ''' >>> help(format ...

  3. OpenWrt中对USB文件系统的操作, 以及读写性能测试

    参考 http://h-wrt.com/en/doc/flash 1. 查看usb存储在启动日志中的信息 # dmesg [ 5.720000] usbcore: registered new int ...

  4. Ubuntu的一些小技巧, 备忘

    Ubuntu下打开Scroll Lock键盘灯 一直以为灯坏了, 后来发现在win7下工作正常... 原来是跟系统有关系的. 在Ubuntu18.04下可以通过这个命令开关Scroll Lock灯 # ...

  5. js getAttribute getAttributeNode

    getAttribute():返回属性值,是一个文本字符串 getAttributeNode("属性名"):返回属性节点,是一个对象 <p id="bj" ...

  6. JAVA常见异常解析

    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...

  7. ubuntu(14.04) 安装ssh,并使用root用户登录

    1.apt-get install openssh-server 2.修改ssh的配置文件/etc/ssh/sshd_config 注释掉以前的:PermitRootLogin without-pas ...

  8. linux服务器的Gzip文件压缩方法[转]

    一.gzip介绍 gzip是GNU zip的缩写,它是一个GNU自由软件的文件压缩程序,也经常用来表示gzip这种文件格式.软件的作者是Jean-loup Gailly和Mark Adler.1992 ...

  9. oracle11g本地可以访问但局域网无法访问

    问题描述,现在有两台电脑 A 和 B : 1)电脑 A 上有 Oracle11G服务端: ip地址 192.168.1.198; 端口1521: 2)电脑 A 本机连接数据库正常,可以登录及操作等: ...

  10. Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

    在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论内存屏障的相关内容. 三.内存屏障 不知读者是是否记得在笔 ...