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/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
随机推荐
- Java开发工程师(Web方向) - 03.数据库开发 - 第3章.SQL注入与防范
第3章--SQL注入与防范 SQL注入与防范 经常遇到的问题:数据安全问题,尤其是sql注入导致的数据库的安全漏洞 国内著名漏洞曝光平台:WooYun.org 数据库泄露的风险:用户信息.交易信息的泄 ...
- (Python爬虫04)了解通用爬虫和聚焦爬虫,还是理论知识.快速入门可以略过的
如果现在的你返回N年前去重新学习一门技能,你会咋做? 我会这么干: ...哦,原来这个本事学完可以成为恋爱大神啊, 我要掌握精髓需要这么几个要点一二三四..... 具体的学习步骤是这样的一二三.... ...
- c字符指针与字符数组的区别
1.定义 char *pchar; //定义了指针,没赋值之前不能使用.如果:printf("*pchar:%c\n",*pchar); 出现段错误Segmentation fa ...
- Logistic回归和SVM的异同
这个问题在最近面试的时候被问了几次,让谈一下Logistic回归(以下简称LR)和SVM的异同.由于之前没有对比分析过,而且不知道从哪个角度去分析,一时语塞,只能不知为不知. 现在对这二者做一个对比分 ...
- 机器人控制tcp通信参数调优
机器人使用WiFi通信,实现指令下传,状态上传.而WiFi信道平时带宽较稳定,但会在某些时候突然中断,造成ping的延时较高,但可以马上恢复.如果一直ping,则一般情况下ping值很小,但长时间(数 ...
- Javascript闭包演示【转】
文章出自http://www.cnblogs.com/snandy/archive/2011/03/01/1967628.html 有个网友问了个问题,如下的html,为什么点击所有的段落p输出都是5 ...
- python执行linux命令的两种方法
python执行linux命令有两种方法: 在此以Linux常用的ls命令为例: 方法一:使用os模块 1 2 3 shell# python >> import os >> ...
- 算法与数据结构3.3 calculator
★实验任务 小 V 发明了一个神奇的整数计算器: 给定一个合法的表达式,这个计算器能求出这个表达式的最终答案. 表达式可能包含: +:运算符,整数加法.如 1+1=2 -:运算符,整数减法.如 1-1 ...
- freefcw/hustoj Install Guide
First of all, this version hustoj is a skin and improved for https://code.google.com/p/hustoj/. So t ...
- ssl证书验证的问题
对于https请求,是需要ssl证书验证的请求的,所以如果在请求时如果不带ssl证书,那么可以忽略证书的验证 有三种方法去实现: 1.Requests请求: 在文档中可以看到:http://docs. ...