码迷,mamicode.com
首页 > 其他好文 > 详细

P1455 搭配购买

时间:2020-09-24 20:55:01      阅读:41      评论:0      收藏:0      [点我收藏+]

标签:朋友   space   ios   back   values   获得   size   int   its   

P1455 搭配购买

题目描述

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

}

 

P1455 搭配购买

标签:朋友   space   ios   back   values   获得   size   int   its   

原文地址:https://www.cnblogs.com/BlairGrowing/p/13715188.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!