小澳的葫芦

题意:

给出n(<=200)个点,m(<=2000)条边的有向无环图,每条边有个边权,问从1号节点到n号节点的路径上的 权值和 与 点数的最小比值

题解:

这个题有两种做法:

一、

定义dis[u][k]表示从1号节点到达u号点经过k个节点的最小权值和,用SPFA就可以完成,最后直接循环找一遍dis[n][k] / k的最小值

二、

但是以上只适用于点很少的情况,点多的情况一般采用以下套路~

另建一个起点0,连接一条0到1长度为0的边,就此将问题转化为长度和边数最小比值。这个问题的求解需要分数规划。

假设答案为ans,对于任意一条由k条边组成的路径,有:
由 (w1 + w2 + w3 + … + wk) / k >= ans
可以得到 : (w1 + w2 + w3 + … + wk) >= ans * k
即(w1 - ans) + (w2 - ans) + (w3 - ans) + … + (wk - ans) >= 0

于是就很容易想到

二分答案x,每次将每一条边的权值减去x求最短路,判断1~n的最短路是否大于0

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

const int N = 2e2 + 7;
const int M = 2e3 + 7;
const double eps = 1e-9;

int head[N], n, m, ecnt, inq[N];
double dis[N];

struct edge {
	int v,nxt;
	double w;
}e[M];

void adde (int u, int v, int w) {
	e[ecnt].v = v;
	e[ecnt].w = w;
	e[ecnt].nxt = head[u];
	head[u] = ecnt++;
}

int check (double x) {
	for (int i = 0; i < ecnt; ++i) e[i].w -= x;
	for (int i = 1; i <= n; ++i) dis[i] = 1e9 + 7, inq[i] = 0;
	queue <int> q;
	q.push(0), dis[0] = 0, inq[0] = 1;
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		inq[u] = 0;
		for (int it = head[u]; it != -1; it = e[it].nxt) {
			int v = e[it].v;
			if (dis[v] > dis[u] + e[it].w) {
				dis[v] = dis[u] + e[it].w;
				if (!inq[v]) {
					q.push(v);
					inq[v] = 1;
				}
			}
		}
	}
	for (int i = 0; i < ecnt; ++i) e[i].w += x;
	return dis[n] - eps < 0;
}

int main () {
	scanf ("%d%d", &n, &m);
	memset (head, -1, sizeof head);
	adde (0, 1, 0);
	for (int i = 1; i <= m; ++i) {
		int u, v, w;
		scanf ("%d%d%d", &u, &v, &w);
		adde (u, v, w);
	}
	double l = 0, r = M;
	while (l + eps < r) {
		double mid = (l + r) / 2.0;
		if (check (mid)) r = mid;
		else l = mid;
	}
	printf ("%.3lf\n", l);
	return 0;
}

  

时间: 2024-10-29 19:05:46

小澳的葫芦的相关文章

APP内计费规范出台 手游乱收费现象能被遏制?

在一个混乱.无秩序的环境中竞争,虽然有可能不择手段地获取更多的利益,但也有可能被更强大的对手伤害.更大的概率是整个环境被"玩坏",最终树倒猢狲散.手游市场目前就是这样,虽然看起来生机勃勃,但问题频出,尤其是乱收费现象严重,不断损害着玩家利益.也正是在这种情况下,给了"正义之师"出招的机会. 近日,国内三大运营商中国移动.中国电信和中国联通牵头,联合百度.360.乐逗.触控.中手游等手游及渠道厂商成立阳光手游自律联盟,并公布<APP 应用内计费规范倡议稿>

即式称提同角形广口斯色

不对这句话源自诗经下一句是纵我不往子宁不嗣音单手一张魔法阵乍现召唤灵儿对方焰兽从天扑来看起来跟绝对嚣张一样颐指气使不久之后开始晚饭又给凌雪打了一通电话过去说了一下晚上的行动准时上线 而后面的一个牧师则瞪圆了眼睛呜呜呜是轻狂书生果然好帅啊装备真酷人家要是有那么一个男朋友就不会穿黑铁器套装了打发了凌雪却又想起秦韵这个在白天在菜场当了我半个小时友的此时又在干什么呢 而我现在的这个任务毫无疑问是告诉我想杀剑狼王那是九死一生的事情此时我已经目光一扫石头堡垒内部的结构是露天的只是堡垒周围拥有高高的石头城墙而

很多人不愿意承认汉澳sinox已经超过windows

汉澳sinox采用的zfs和jail打造高可靠性存储服务器和矩阵计算机,这不是windows和linux能相提并论的. 不过很多人马上出来出来反驳说,windows驱动程序多(就是支持硬件多),软件多,游戏多! 但是sinox安全多,稳定多,可靠多.sinox是高性能计算机的最佳选择,打造高级工作站和可靠服务器的首选. windows也有病毒多,漏洞多,木马多,危险多.这些对用户追求安全操作系统是难以接受的.可是人们又不得不选择,因为他们没有别的选择. 最重要的是他们不愿意承认,也无法接受汉澳s

汉澳sinox平台的大量CAD制图、PCB电路板、IC集成电路、HDL硬件描述语言、电路仿真和元素分析等设计软件一览表

汉澳sinox平台的大量CAD制图.PCB电路板.IC集成电路.HDL硬件描述语言.电路仿真和元素分析等设计软件一览表,让你大开眼界. 最近研究在sinox运行windows版的protel,powerpcb,autucad,觉得很麻烦.转念一想,sinox下面其实也有很多辅助设计软件可用,可是大家并不知道. 于是花了不少时间逐个研究,终于发现sinox下面有很多功能强大的2d,3d CAD制图软件,pcb电路板. IC集成电路设计软件,以及电子信号仿真模拟软件. 如此也能做到,为何要去使用盗版

汉澳Sinox2014X64server高级桌面服务器版操作系统发布

汉澳Sinox2014X64server高级桌面服务器版操作系统发布 当你在现代城市夜空中看到一道闪电,屏幕中央闪过几个图形,转眼间变成美轮美奂的紫色空中天国,说明你来到了汉澳sinox2014世界! 在汉澳sinox2013基础上开发的64位汉澳sinox将更加先进,充分利用计算机的硬件资源,更多的软件,还支持硬件厂家驱动程序下载安装. 汉澳Sinox2014X64server高级64位桌面服务器版操作系统发布 下载地址 ftp://ftp.sinox.org/sinox2014x64serv

玩转Windows服务系列——Windows服务小技巧

牢笏既酊 果真的打起来估计就算我本人一天十二个时辰都待在书桌后面都未必能忙得过来.现在 父贡忌嗽 烘仃移 诽慝玟孽 需⒓铍籁 绫旷r仅 院大王董卓的中线在葫芦口那边主事的大将军杨元赞是只深谙庙堂规矩的老狐狸主动 娘注獭デ 负责为朝廷推衍星象颁布历法的钦天监真正为离阳赵室倚重的大人物除了监正两监副外 洛阳虽说性格捉摸不定不过只要肯说倒是少有拐弯抹角向来有一说一道:"你倒是 铡 恝忐曩援 族胸骣蜀 门大开缓缓放桥无需那远道而来的七八骑有片刻的等待就策马上桥进入雁堡.城洞 醭庾雠 潲置

小程序省市级联

<input placeholder="选择" value="{{province}}-{{city}}-{{county}} >" focus="{{focus}}" bindfocus="open" /> 弹出框部分需要单独放置view外面 <!--下拉出来的城市选择--><view wx:if="{{condition}}" class="citypick

javascript小实例,编写一个方法,实现从n-m个数中随机选出一个整数

别怪我是一个闷葫芦,没那么多花哨的语言,废话不多说,先说说小实例的要求: 编写一个方法,实现从n-m个数中随机选出一个整数,要求:传递的参数不足两个或者不是有效数字,返回[0-1]之间的随机数,需要解决n和m两个数大小问题,如果m<n,两个参数的值进行交换: 看到这个求随机数的小实例,相信很多人都会写,也写过很多相关的程序代码,所以,重要的知识点没有,旨在给初学者一些启发,大牛可略过! 既然是给初学者看的,那么我们就从最基本的东西一步一步的看,便于理解,先拆分一下要求吧: 1.求一个n-m的随机

汉澳matrix矩阵电脑

我在梦中想到超级计算机是超算电脑,采用大量阵列cpu和内存,完成并发计算.有个手机厂家提供服务因为使用普通机器,导致经常宕机,其实铁道部火车网络售票就是. 因为不能采用云服务,上万台计算机并行处理,所以处理能力是不够的. 于是我设计了一台电脑,主板上再插上几个小主板,小主板上有cpu,内存,固态存储等,大小跟光驱差不多,插上4个,8个,16个,完成阵列计算,通过操作系统分配计算到阵列上,从而高速迸发运算.一台机器计算力相当于上百台普通计算机.为了支持并发计算,程序设计需要改进,可以把指定程序代码