并查集的一般操作 ②

news/2024/7/3 7:20:06

RT

 

题目描述

 

明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵已经被老板编号为1,2,3,……,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的钱是有限的,所以你肯定是想用现有的钱买到尽量多价值的云。

输入格式:

 第1行n,m,w,表示n朵云,m个搭配和你现有的钱的数目

 第2行至n+1行,每行ci,di表示i朵云的价钱和价值

 第n+2至n+1+m ,每行ui,vi表示买ui就必须买vi,同理,如果买vi就必须买ui

 

 输出格式:

 一行,表示可以获得的最大价值

 

输入输出样例

输入:      输出:

5 3 10          1
3 10
3 10
3 10
5 100
10 1
1 3
3 2
4 2

Solution

通过观察,发现是一道并查集和01背包的好 题;

只要把链接的云并成一组,然后对这些组进行dp就行了;

 

详见代码

#include <cstdio>
#include <algorithm>

using namespace std;

int n,m,w;int val[100010],wt[100010];
///**并查集**///
struct b
{
    int par[100010];
    inline void  ih(){for(int i=1;i<=n;i++)par[i]=i;}
    int f(int x){return par[x]=(par[x]==x)?x:f(par[x]);}
    int u(int x,int y)
    {

        val[f(x)]+=val[f(y)];
        wt[f(x)]+=wt[f(y)];
        par[f(y)]=f(x);
    }
}s;
int a,b;
int ans,dp[100010];
int val1[100010];int wt1[100010];int main()
{
    //freopen("in","r",stdin);
    scanf("%d%d%d",&n,&m,&w);
    for(int i=1;i<=n;++i)
    {
        scanf("%d%d",&wt[i],&val[i]);
    }
    s.ih();
    for(int i=1;i<=m;++i)
    {
        scanf("%d%d",&a,&b);
        s.u(a,b);
    }
    int sum=1;
    for(int i=1;i<=n;++i)        /// 巧妙的操作
    {
        if(s.par[i]==i)
        {
            val1[sum]=val[s.f(i)];
            wt1[sum]=wt[s.f(i)];
            sum++;
        }
    }
///**01背包*////
    for(int i=1;i<=sum;++i)
    {
       for(int j=w;j>=wt1[i];--j)
        {
            dp[j]=max(dp[j],dp[j-wt1[i]]+val1[i]);
        }
    }
    printf("%d",dp[w]);
}
View Code

 

21:07:43

 

转载于:https://www.cnblogs.com/AidenPearce/p/8280535.html


http://www.niftyadmin.cn/n/2133348.html

相关文章

数模必备插值拟合

插值与拟合 两者都可用于对较少数据量的补充&#xff0c;但是一般插值用于数据量较少的情况n<30 拟合用于数据量较多的情况 n>30。 文章目录(1)插值与拟合采用的方法1.插值2.拟合(2)具体的代码操作方法1.插值的matlab2.拟合的matlab(1)插值与拟合采用的方法 1.插值 拉格…

Windows+Ubuntu-18.04双系统装机指南

WindowsUbuntu-18.04双系统装机指南 在看了网上很多的指南和教程之后&#xff0c;外加踩了好几个坑&#xff0c;最后终于安装成功&#xff0c;这里做一个记录&#xff0c;免得以后又需要安装。 文章目录(0) 准备工具(1) 准备分区(2) 制作启动U盘(3) 进入BIOS(4) 安装Ubuntu(5) …

规划模型的典型例题

规划模型的典型例题 文章目录(1) 平板装货问题(2) 选修课策略问题问题1问题2(3) 最优组队问题(1) 平板装货问题 有七种规格的包装箱要装到两辆平板车上。包装箱的宽和高是一样的&#xff0c;但厚度t (厘米)和重量w (公斤)是不同的。下表给出了每种包装箱的厚度&#xff0c;重量…

传统多线程开发

Android开发高级进阶 第一章学习 传统多线程开发 概要&#xff1a; 之前的文章里写过了AsyncTask的一些坑&#xff0c;这次就不讲它了&#xff0c;使用传统的 Handler和Message来进行线程的使用&#xff0c;并且第一次添加了CallBack方式的接口进行回调操作 多线程 这概念并不需…

Linux 中 Vi 的使用

vi —— 终端中的编辑器 目标 vi 简介打开和新建文件三种工作模式常用命令分屏命令常用命令速查图 01. vi 简介 1.1 学习 vi 的目的 在工作中&#xff0c;要对 服务器 上的文件进行 简单 的修改&#xff0c;可以使用 ssh 远程登录到服务器上&#xff0c;并且使用 vi 进行快…

Jupyterlab 插件安装后侧边栏找不到的解决

Jupyterlab 插件重新安装后侧边栏找不到的解决 截止发帖时间&#xff0c;JupyterLab 有这样一个 bug&#xff0c;在官方文档找不到解决方案&#xff0c;我找了好几天找到了一个 issue 才解决&#xff1a; JupyterLab 安装 extension &#xff08;插件&#xff09;时&#xff0…

那些web前端经典面试题大全及答案

阅读目录JavaScript部分JQurey部分HTML/CSS部分正则表达式开发及性能优化部分本篇收录了一些面试中经常会遇到的经典面试题以及自己面试过程中遇到的一些问题&#xff0c;并且都给出了我在网上收集的答案。马上就要过春节了&#xff0c;开年就是崭新的一年&#xff0c;相信很多…

ABP框架系列之三十七:(Navigation-导航)

Every web application has some menu to navigate between pages/screens. ASP.NET Boilerplate provides a common ifrastructure to create and show menu to users. 每个Web应用程序都有一些菜单在页面/屏幕之间导航。ASP.NET提供了一个通用的ifrastructure样板文件创建和显…