题目描述

有一个国家有N个城市和M条道路,这些道路可能连接相同的城市,也有可能两个城市之间有多条道路。

有一天,有一伙强盗占领了这个国家的所有的道路。他们要求国王献给他们礼物,进而根据礼物的多少而放弃占领某些边。对于每一条道路,强盗都给出了相应的要求,金子gi的数量,银子si的数量。也就是说若国王给强盗G个金子,S个银子,那么他们就会放弃占领满足gi<=G and si<=S 的道路。

现在国王知道金子、银子的单价,他想花费钱财购买金银送给强盗,使强盗放弃一些道路,进而使N个城市能互相到达。但是国王又想花费最少。请你计算最少的花费。

输入格式

第一行有两个整数N和M,表示有N个城市M条道路。

第二行有两个整数G和S,表示购买金子和银子的价格。

以后M行,每行4整数X,Y,g,s,表示这条道路连接X城市和Y城市,要求g个金子,s个银子。

100% N<=200,M<=50000

输出格式

一个整数,表示最少花费。要是没有满足的情况,输出-1。


二维限制的最小生成树。

第一眼思路是二分套二分,然后做最小生成树。但是答案显然没有单调性,所以不能这样做。所以我们只能试试暴力。首先要确定的是,购买的金子数量肯定等于某条边的边权,如果小了那可能整个图不连通,大了又浪费了;银子同理。所以我们可以先将所有边按金子数量从小到大排序,然后枚举每条边的边权作为这一次购买的金子数量。那么此时金子数小于等于当前金子数的边都是可以选的,如果我们用这些边构建出了一棵生成树那么就是合法的,否则不合法。

在枚举了每种金子数时,我们为了使代价尽量小,我们需要尽量选银子少的路。所以此时我们将可选的边再按照银子数从小到大进行排序,用Kruskal求出最小生成树。如果成功的话,就用这种方案的代价与答案进行比较取更优。

忽略排序的时间复杂度为O(M^2),显然太慢。

接下来我们想一下优化。通过分析可以得出,设当前可选的边的集合为A,选中的边的集合为B,也就是说B是当前最优的边。如果后面枚举金子数时加进来新的边,那新的生成树的边肯定也是在新边和B集合中找。也就是说,B在A中的补集已经没有用了,我们将它删掉。那么我们每次需要处理的边最多就只有n-1条,时间复杂度为O(MN)。

那么上代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 201
#define maxm 50001
using namespace std; struct edge{
int u,v;
long long g,s;
bool operator<(const edge &e)const{ return g==e.g?s<e.s:g<e.g; }
}e[maxm];
int fa[maxn],cnt;
int stack[maxn],top;
int n,m;
long long g,s,ans=1e18; inline long long read(){
register long long x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
} int get(int x){ return x==fa[x]?x:fa[x]=get(fa[x]); }
inline void kruskal(){
sort(e+1,e+1+m);
for(register int i=1;i<=m;i++){
stack[++top]=i,cnt=0;
for(register int j=top;j>=2;j--) if(e[stack[j]].s<e[stack[j-1]].s) swap(stack[j],stack[j-1]);
for(register int j=1;j<=n;j++) fa[j]=j;
for(register int j=1;j<=top;j++){
int u=e[stack[j]].u,v=e[stack[j]].v;
if(get(u)==get(v)) continue;
fa[get(u)]=get(v),stack[++cnt]=stack[j];
if(cnt==n-1) break;
}
if(cnt==n-1) ans=min(ans,e[i].g*g+e[stack[cnt]].s*s);
top=cnt;
}
} int main(){
n=read(),m=read(),g=read(),s=read();
for(register int i=1;i<=m;i++){
e[i].u=read(),e[i].v=read(),e[i].g=read(),e[i].s=read();
}
kruskal();
if(ans==1e18) puts("-1");
else printf("%lld\n",ans);
return 0;
}

CF76A Gift的更多相关文章

  1. CF76A.Gift [最小生成树]

    CF76A.Gift 题意:noi2014魔法森林弱化版QwQ,最小化\(max(g_i)*G + max(s_i)*S\)的最小生成树 考虑按g升序加边,用已在生成树中的边和新加入的边求当前最小生成 ...

  2. USACO . Greedy Gift Givers

    Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts ...

  3. CF# Educational Codeforces Round 3 B. The Best Gift

    B. The Best Gift time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. 快来玩“Gift大转盘”百分百赚好礼

    现在开始到今年的最后一天,你天天都可以来转100%中奖的“ Gift大转盘 ”.代金券.产品折扣.精美纪念礼,没有多余规则.全部网友都可参加,转到就是你赚到,赶快转起来吧! >>活动主页& ...

  5. Gift Hunting(分组背包)

    Gift Hunting Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. Codeforces Educational Codeforces Round 3 B. The Best Gift 水题

    B. The Best Gift 题目连接: http://www.codeforces.com/contest/609/problem/B Description Emily's birthday ...

  7. 1002 GTY's birthday gift

    GTY's birthday gift                                                                       Time Limit ...

  8. [light oj 1328] A Gift from the Setter

    1328 - A Gift from the Setter   Problem setting is somewhat of a cruel task of throwing something at ...

  9. 119 - Greedy Gift Givers

     Greedy Gift Givers  The Problem This problem involves determining, for a group of gift-giving frien ...

随机推荐

  1. Spring Data JPA 基础第二篇

    主要调用工具类JpaUtils类 package cn.itcast.utils;import javax.persistence.EntityManager;import javax.persist ...

  2. Web服务器-并发服务器-单进程单线程非堵塞方式(3.4.3)

    @ 目录 1.分析 2.代码 关于作者 1.分析 当socket去监听的时候,是堵塞的状态 通过tcp_sever_socket.setblocking(False)去设置不堵塞 当socket发现没 ...

  3. MyBatis 与 Spring 的完美整合方法

    MyBaits 整合 Spring MyBatis-Spring 项目 第一步:创建测试工程 第二步:引入依赖 jar 包 第三步:编写 Spring 配置文件 第四步:编写 MyBatis 配置文件 ...

  4. OSM地图本地发布-如何生成各省市矢量地图

    目录 1.缘起 2.问题 3.分析 4.生成自定义地区矢量瓦片 4.1.启动docker 4.2.启动postGIS容器 4.3.设置不清理上次的结果 4.4.删除默认切图范围 4.5.修改切图层级和 ...

  5. Collection集合重难点梳理,增强for注意事项和三种遍历的应用场景,栈和队列特点,数组和链表特点,ArrayList源码解析, LinkedList-源码解析

    重难点梳理 使用到的新单词: 1.collection[kəˈlekʃn] 聚集 2.empty[ˈempti] 空的 3.clear[klɪə(r)] 清除 4.iterator 迭代器 学习目标: ...

  6. NET 5使用HangFire定时任务

    注意:1. 当Hangfire服务由Web程序来启用时,默认情况下,web应用程序中的Hangfire服务器实例在第一个用户访问您的站点之前不会启动.甚至,有一些事件会在一段时间后导致web应用程序关 ...

  7. CentOS8/Windows 安装RabbitMQ

    Centos8安装rabbitmq 1.安装erlang(rabbitmq是用erlang语言开发的,erlang版本需要22.x以上) yum install erlang 2.下载rabbitmq ...

  8. apk获取sha1值的方法

    安卓应用都使用一个签名证书(.keystore或.jks文件)签名,签名证书可以由jdk生成.证书生成后,证书就有其sha1值. 使用此证书打包后的安卓应用,也有其一样的sha1值.md5值和sha2 ...

  9. active mq 简单配置

    ---恢复内容开始--- 在activemq.xml 配置activemq的响应配置: 配置消息持久化: <persistenceAdapter>             <!-- ...

  10. .NET Core学习笔记(8)——Entity Framework Core之Database First

    曾经我以为再也不会去弄啥Database First,然鹅我错了.这个世界上就是有啪啪打脸和真香的时候.当小伙伴拿着做好的DB表结构和SQL脚本递过来的时候,我知道我没法拒绝.望着他突起的肱二头肌和充 ...