您的位置:首页 > 其它

哈理工第六届程序设计大赛 D 经商 (并查集+背包)

2016-11-20 21:09 387 查看
思路:题目还是比较裸的。。并茶几+01背包搞搞就可以了

#include<bits/stdc++.h>
using namespace std;
const int maxn = 10000+7;
#define LL long long
int fa[maxn];
void init(int n)
{
for(int i = 0;i<=n;i++)fa[i]=i;
}
int Find(int x){return fa[x]==x?x:fa[x]=Find(fa[x]);}
void mix(int x,int y)
{
int xx = Find(x);
int yy = Find(y);
if(xx!=yy)
fa[xx]=yy;
}
LL dp[505];
LL a[maxn],b[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(dp,0,sizeof(dp));
int n,m,c;
scanf("%d%d%d",&n,&m,&c);
init(n);
for(int i=2;i<=n;i++)
scanf("%lld%lld",&a[i],&b[i]);
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
mix(u,v);
}
for(int i=2;i<=n;i++)
{
if(Find(i)==Find(1))
{
for(int j=c;j>=0;j--)
if(j-a[i]>=0)
dp[j]=max(dp[j],dp[j-a[i]]+b[i]);
}
}
printf("%lld\n",dp[c]);
}
}


Problem D: 经商

Time Limit: 1 Sec  Memory Limit: 32 MB

Submit: 128  Solved: 49

[Submit][Status][Web
Board]

Description

 
小d是一个搞房地产的土豪。每个人经商都有每个人经商的手段,当然人际关系是需要放在首位的。

小d每一个月都需要列出来一个人际关系表,表示他们搞房地产的人的一个人际关系网,但是他的精力有限,对应他只能和能够接触到的人交际。比如1认识2,2认识3,那么1就可以接触3进行交际,当然1和2也可以交际。

小d还很精明,他知道他和谁交际的深获得的利益大,接下来他根据自己的想法又列出来一个利益表,表示他和这些人交际需要耗用多少精力,能够获得的利益值为多少。

小d想知道,他在精力范围内,能够获得的利益值到底是多少。

设定小d自己的编号为1.并且对应一个人的交际次数限定为1.

Input

 
本题包含多组输入,第一行输入一个数t,表示测试数据的组数

每组数据的第一行输入三个数,N,M,C,表示这个人际关系网一共有多少个人,关系网的关系数,以及小d的精力值

接下来N-1行,每行两个数ai,bi。这里第i行表示和编号为i+1的人认识需要花费ai的精力,能够获得的利益值为bi。

再接下来M行,每行两个数x,y,表示编号为x的人能够和编号为y的人接触

t<=50

2<=N<=10000

1<=M<=10*N

1<=ai,bi<=10

1<=C<=500

1<=x,y<=N

Output

 
输出包含一行,表示小d能够获得的最大利益值

Sample Input

15 3 75 103 24 31 1001 22 31 4

Sample Output

10

HINT

 

小明能够接触到的人的编号有:2 3 4,那么对应接触编号为2的人花费5精力能够获得10的利益值是最优方案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐