标签:朋友 space ios back values 获得 size int its
明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有 n 朵云,云朵已经被老板编号为1,2,3,...,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的钱是有限的,所以你肯定是想用现有的钱买到尽量多价值的云。
第一行输入三个整数,n,m,w表示有 n 朵云,m 个搭配和你现有的钱的数目。
第二行至 n+1 行,每行有两个整数,c,d,表示第 i 朵云的价钱和价值。
第 n+2至 n+1+m行 ,每行有两个整数u,v。表示买第 u朵云就必须买第 v 朵云,同理,如果买第 v 朵就必须买第u朵。
一行,表示可以获得的最大价值。
输入 #1
5 3 10 3 10 3 10 3 10 5 100 10 1 1 3 3 2 4 2
输出 #1
1
代码:
#include <iostream> #include<bits/stdc++.h> #include<queue> #include<vector> #include<queue> #include<map> using namespace std; const int max_size=1000; int pre[max_size],height[max_size]; void init_set(int count){ for (size_t i = 1; i <= count; i++) { pre[i]=i; height[i]=0; } } int find_set(int x){ if (x!=pre[x]) { pre[x]=find_set(pre[x]); } return pre[x]; } void union_set(int x , int y ){ x = find_set(x); y = find_set(y); if(height[x]==height[y]){ height[x]+=1; pre[y] = x; }else{ if(height[x]<height[y]){ pre[x]=y; }else{ pre[y]=x; } } } int main(){ int n,m,w,num1,num2; cin>>n>>m>>w; init_set(n); map<int,vector<int> >ump; for (int i = 1; i <=n; i++) { vector<int>vec; cin>>num1>>num2; vec.push_back(num1); vec.push_back(num2); ump[i]=vec; } for (int i = 1; i <= m; i++) { cin>>num1>>num2; union_set(num1,num2); } set<int >st ; set<int >::iterator it= st.begin() ; for (int i = 1; i <= n; i++) { if(st.find(pre[i])==st.end()){ st.insert(pre[i]); } } int values=0,flag=1; for (set<int>::iterator it = st.begin(); it != st.end(); it++) { int tmp=0,cost=0,flag=1; for (int i = 1; i <= n&&flag; i++) { if(pre[i]==*it){ if(cost+ump[i][0]>w){ cost = 0; tmp =0; flag=0; } if(flag){ cost+=ump[i][0]; tmp+= ump[i][1]; cout<<" cost = "<<cost << " tmp = "<<tmp<<endl; } } if(!flag) break; } values = max(tmp,values); } cout<<values<<endl; }
标签:朋友 space ios back values 获得 size int its
原文地址:https://www.cnblogs.com/BlairGrowing/p/13715188.html