JXNU acm选拔赛 涛涛的Party
涛涛的Party
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 21 Accepted Submission(s) : 8
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
涛神因为极强,并且特别帅,所以拥有很多美女的联系方式,每个美女都有自己的食量以及魅力值,大家都知道,物以类聚,人以群分,朋友的朋友就是自己的朋友,所以美女一般都是有自己的美女朋友圈,而且这些美女特别团结,如果她的朋友有没有被邀请的她就不会答应邀请。涛涛想办一个party,但是他只准备了w kg的食物,他想获得最大的美女魅力值,不知道怎么邀请美女,于是他去问你,你能告诉他,他能获得的美女魅力数是多少吗Input
数据有多组,第一行输入n,m和w(1≤n≤1000,0≤m≤min(n*(n-1)/2,10^5),1≤w≤1000);第二行输入n个整型变量w1,w2,...,wn(1≤wi≤1000)代表美女i的食量;第三行输入n个整型变量b1,b2,...,bn(1≤bi≤106)代表美女i的魅力值;接下来的m行输入两个数x和y(1≤xi,yi≤n,xi≠yi),代表x和y是朋友Output
输出涛涛能获得的最大魅力值Sample Input
3 1 5 3 2 5 2 4 2 1 2 4 2 11 2 4 6 6 6 4 2 1 1 2 2 3Sample Output
6 1
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 struct Node{ 7 int wei,mm,fa; 8 }a[1005]; 9 int sum1[1005]; 10 int sum2[1005]; 11 int Find(int x) 12 { 13 if(x==a[x].fa) return x; 14 else{ 15 a[x].fa=Find(a[x].fa); 16 return a[x].fa; 17 } 18 } 19 void join(int x,int y) 20 { 21 int fx=Find(x),fy=Find(y); 22 if(fx!=fy) 23 { 24 a[fy].fa=fx; 25 } 26 } 27 int main() 28 { 29 int n,m,w; 30 while(~scanf("%d%d%d",&n,&m,&w)) 31 { 32 for(int i=1;i<=n;i++){ 33 a[i].fa=i; 34 scanf("%d",&a[i].wei); 35 } 36 for(int i=1;i<=n;i++){ 37 scanf("%d",&a[i].mm); 38 } 39 int xx,yy; 40 for(int i=0;i<m;i++) 41 { 42 scanf("%d%d",&xx,&yy); 43 join(xx,yy); 44 } 45 memset(sum1,0,sizeof(sum1)); 46 memset(sum2,0,sizeof(sum2)); 47 for(int i=1;i<=n;i++)//统计各个朋友圈的魅力值和耗的粮食 48 { 49 int ff=Find(i); 50 sum1[ff]+=a[i].mm; 51 sum2[ff]+=a[i].wei; 52 } 53 int dp[1005]; 54 memset(dp,0,sizeof(dp)); 55 for(int i=1;i<=n;i++) 56 { 57 for(int j=w;j>=sum2[i];j--) 58 { 59 dp[j]=max(dp[j],dp[j-sum2[i]]+sum1[i]); 60 } 61 } 62 cout<<dp[w]<<endl; 63 } 64 return 0; 65 }