您的位置:首页 > 其它

哈理工软件学院"兆方美迪"杯第六届程序设计大赛【高年级组】--决赛 Problem D: 经商 By Assassin

2016-11-21 10:51 267 查看
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

1

5 3 7

5 10

3 2

4 3

1 100

1 2

2 3

1 4

Sample Output

10

思路:其实需要搞清楚一个概念,就是题目中一个关系网中的人,有联系既可以认识,不存在1认识2,2认识3,如果1想认识3必须认识2的情况。而且我们知道c<=500,明显就是背包问题了。

确定了出发点是1,那么我们需要找到和1相连的整图,我用vector数组dfs一发实现的

思路就是这样,上代码:

#include<bits/stdc++.h>
#define input freopen("input.txt","r",stdin)
using namespace std;
vector<int>vec[10050];
int value[10050][2],v[10050];
void dfs(int x){
int i;
for(i=0;i<vec[x].size();i++){
if(v[vec[x][i]]==0){
v[vec[x][i]]=1;
dfs(vec[x][i]);
}
}
}
long long dp[1000];
int main(){
//input;
int t,i,j,n,m,p;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&p);
for(i=2;i<=n;i++){
scanf("%d%d",&value[i][0],&value[i][1]);
}
int s1,s2;
for(i=1;i<=n;i++) vec[i].clear();
for(i=1;i<=m;i++){
scanf("%d%d",&s1,&s2);
vec[s1].push_back(s2);
vec[s2].push_back(s1);
}
memset(v,0,sizeof(v));
dfs(1);
memset(dp,0,sizeof(dp));
long long tmp1=0,tmp2=0;
for(i=2;i<=n;i++){
if(v[i]==1){
for(j=p;j>=value[i][0];j--){
dp[j]=max(dp[j],dp[j-value[i][0]]+value[i][1]);
}
}
}
cout<<dp[p]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐