noip模拟赛 保留道路
【问题描述】
很久很久以前有一个国家,这个国家有N个城市,城市由1,2,3,…,N标号,城市间有M条双向道路,每条道路都有两个属性g和s,两个城市间可能有多条道路,并且可能存在将某一城市与其自身连接起来的道路。后来由于战争的原因,国王不得不下令减小花费从而关闭一些道路,但是必须要保证任意两个城市相互可达。
道路花费的计算公式为wG*max{所有剩下道路的属性g}+wS*max{所有剩下道路的属性s},其中wG和wS是给定的值。国王想要在满足连通性的前提下使这个花费最小,现在需要你计算出这个花费。
【输入格式】
输入文件名为road.in。
第一行包含两个正整数N和M。第二行包含两个正整数wG和wS。
后面的M行每行描述一条道路,包含四个正整数u,v,g,s,分别表示道路连接的两个城市以及道路的两个属性。
【输出格式】
输出文件名为road.out。
输出一个整数,表示最小花费。若无论如何不能满足连通性,输出-1。
【输入输出样例】
road.in
3 3
2 1
1 2 10 15
1 2 4 20
1 3 5 1
road.out
30
【数据规模与约定】
对于10%的数据,N≤10,M≤20;对于30%的数据,N≤100,M≤1000;对于50%的数据,N≤200,M≤5000;
对于100%的数据,N≤400,M≤50000,wG,wS,g,s≤1000000000。
分析:最小生成树问题,只不过有两个量对答案有影响.这种题不可能同时考虑两个量,要消除一个量的影响,就先按照g的大小排序.由于g是排好序的,从小到大枚举边,然后求最小生成树,这就是主要的思路.
这个算法的瓶颈就在于每次插入一条边都要对所有的边排序做最小生成树,非常耗时间.因为有很多边经常被用到,我们可以在处理的时候把它们维护成有序的,这个时候只需要考虑s的大小就可以了,因为max{g}的大小是已知的.每次不用排序了,但是在这么多点中做克鲁斯卡尔算法还是比较慢.
如果新加入一条边,那么组成最小生成树的N条边一定是原来最小生成树的N-1条边和这条新加进来的边中取N-1条边.因为没有选到原来的最小生成树的边一定没有最小生成树上的边优,新加进来的这条边由于不知道它s的具体大小,所以可能在最小生成树中,这样维护一个N条边的边集,每次在上面求最小生成树就可以了.
两个因素互相影响的可以先想办法消除其中一个因素的影响,再来考虑另外一个因素的影响.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll; const ll inf = 1ll << ;
ll n, m, wG, wS, fa[], top, tree[], ans = inf; struct node
{
ll u, v, g, s;
}e[]; bool cmp(node a, node b)
{
return a.g < b.g;
} ll find(ll x)
{
if (x == fa[x])
return x;
return fa[x] = find(fa[x]);
} int main()
{
scanf("%lld%lld", &n, &m);
scanf("%lld%lld", &wG, &wS);
for (int i = ; i <= m; i++)
scanf("%lld%lld%lld%lld", &e[i].u, &e[i].v, &e[i].g, &e[i].s);
sort(e + , e + + m, cmp);
for (int i = ; i <= m; i++)
{
bool flag = false;
for (int j = ; j <= n; j++)
fa[j] = j;
int cur = top + ;
for (int j = ; j <= top; j++)
if (e[tree[j]].s > e[i].s)
{
cur = j;
break;
}
top++;
if (cur == top)
tree[cur] = i;
else
{
for (int j = top; j > cur; j--)
tree[j] = tree[j - ];
tree[cur] = i;
}
int num = ;
for (int j = ; j <= top; j++)
{
int fx = find(e[tree[j]].u), fy = find(e[tree[j]].v);
if (fx != fy)
{
fa[fx] = fy;
tree[++num] = tree[j];
if (tree[j] == i)
flag = ;
}
}
if (num == n - && flag) //如果第i条边的g为最大的g,那么这条边肯定要被选到
ans = min(ans, wG*e[i].g + wS*e[tree[num]].s);
top = num;
}
if (ans == inf)
printf("-1");
else
printf("%lld\n", ans); return ;
}
noip模拟赛 保留道路的更多相关文章
- 【NOIP 模拟赛】 道路
题目描述在二维坐标平面里有 N 个整数点,信息班某一巨佬要访问这 N 个点.刚开始巨佬在点(0,0)处. 每一步,巨佬可以走到上.下.左.右四个点.即假设巨佬当前所在点的坐标是(x,y),那么它下一步 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- Nescafe #29 NOIP模拟赛
Nescafe #29 NOIP模拟赛 不知道这种题发出来算不算侵权...毕竟有的题在$bz$上是权限题,但是在$vijos$似乎又有原题...如果这算是侵权的话请联系我,我会尽快删除,谢谢~ 今天开 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- 2016-06-19 NOIP模拟赛
2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
随机推荐
- es6笔记4^_^function
一.function默认参数 现在可以在定义函数的时候指定参数的默认值了,而不用像以前那样通过逻辑或操作符来达到目的了. es5 function sayHello(name){ //传统的指定默认参 ...
- GIT: 分布式开发 代码管理工具使用命令大全
代码管理工具: GIT 什么是GIT? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目 Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常 ...
- spark操作数据库的几种方法
一.使用jdbcRDD的接口: SparkConf conf = new SparkConf(); conf.setAppName("Simple Application").se ...
- 使用js跳转手机站url的若干注意点
引子: 去年年底公司开发手机站平台,经历了前期的用户群.市场调查,产品需求分析,产品原型设计,ui前端到程序开发上线测试等等工作,终于上线...此处略去本人作为前端开发的心情. 应该说,我们的手机站平 ...
- NOIP2012 普及组真题 4.13校模拟
考试状态: 我今天抽签看了洛谷的… 这我能怂???凶中带吉,我怕考试??我!不!怕! 看着整个机房的男同学们,我明白我是不会触发我的忌了.很好,开刷. A. [NOIP2012普及组真题] 质因数分解 ...
- 蓝桥杯算法训练 区间k大数查询
算法训练 区间k大数查询 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个 ...
- 一键部署 Docker Datacenter ---简化docker数据中心安装步骤
DDC 简介 2016年2月下旬,Docker发布了企业级容器管理和服务部署的整体解决方案平台-Docker Datacenter,简称DDC.DDC 有三个组件构成:1. Docker Univer ...
- # 团队作业MD
队员姓名与学号 051501124 王彬(组长) 111500206 赵畅 031602215 胡展瑞 031602320 李恒达 031602131 佘岳昕 031602431 王源 0316022 ...
- PAT1024 强行用链表写了一发。
主要的思想还是 上课的那个PPT上面的 链表反转的思想. 然后加一点七七八八的 递推. 一层一层往下翻转就好啦. 1A 真开心. 代码:http://paste.ubuntu.net/16506799 ...
- iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现
1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...