博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-4318 Power transmission 模型转化
阅读量:6115 次
发布时间:2019-06-21

本文共 1424 字,大约阅读时间需要 4 分钟。

这题在比赛的时候没做出来实在是不应该。本来也是用对数处理的,但是后面写的七零八落的。

这题也可以直接求,记录每个点最少消耗的流量,剩余流量为初始流量减去这个值,逐步向下迭代。

当然这里可以去求他的剩余值,根据公式 最后的流量 L = I * (1-p1) * (1-p2) * ... * (1-pn) 我们对两边同时取对数的话,那么我们就将乘法化成了加法,并且直接求一个最长路就可以了。最后再拿总流量减去最大的剩余量即可。

代码如下:

#include 
#include
#include
#include
#include
#include
#define eps 1e-6using namespace std;int head[50005], N, idx, S, T, P, q[10000005], visit[50005];double dis[50005];struct Edge{ int v, next; double fee;}e[2500005];void insert(int x, int y, int fee){ ++idx; e[idx].v = y, e[idx].fee = log(1 - fee/100.); e[idx].next = head[x], head[x] = idx;}void spfa(){ int front = 0, tail = 1, pos; q[tail] = S; fill(dis+1, dis+N+1, 0); dis[S] = log(1.*P); while (front != tail) { pos = q[++front]; visit[pos] = 0; for (int u = head[pos]; u != -1; u = e[u].next) { if (dis[pos] + e[u].fee - dis[e[u].v] > eps) { dis[e[u].v] = dis[pos] + e[u].fee; if (!visit[e[u].v]) { // spfa中防止多次入队 q[++tail] = e[u].v; visit[e[u].v] = 1; } } } } if (dis[T] == 0) { puts("IMPOSSIBLE!"); } else { printf("%.2lf\n", P - exp(dis[T])); }}int main(){ int M, y, fee; while (scanf("%d", &N) == 1) { memset(head, -1, sizeof (head)); memset(visit, 0, sizeof (visit)); idx = -1; for (int i = 1; i <= N; ++i) { scanf("%d", &M); for (int j = 1; j <= M; ++j) { scanf("%d %d", &y, &fee); insert(i, y, fee); } } scanf("%d %d %d", &S, &T, &P); spfa(); } return 0;}

转载地址:http://ejvka.baihongyu.com/

你可能感兴趣的文章
linux硬盘安装的方法
查看>>
Android判断、创建和删除快捷方式
查看>>
云平台编程与开发(二):X5Cloud云平台SDK包概述
查看>>
Android图片失真问题
查看>>
我的友情链接
查看>>
通过路由配置提高Wi-Fi速度和距离
查看>>
使用Gradle构建Java项目
查看>>
Leetcode PHP题解--D26 766. Toeplitz Matrix
查看>>
爬虫简单入门-接口寻找调用
查看>>
mysql常用语句
查看>>
程序员随想-关于优雅
查看>>
爱加密联合应用之星(APPSTAR)为开发者提供免费云加密服务
查看>>
部署基于Centos7的Zimbra邮件系统-之一系统规划及DNS服务配置
查看>>
如何理解比特币的底层协议
查看>>
cocos集成科大讯飞语音识别
查看>>
The Reactive Manifesto(响应式宣言)
查看>>
R语言笔记 attach()、detach()和with()
查看>>
ftp操作
查看>>
服务器双网卡双网关
查看>>
mysql入门之三:索引添加删除
查看>>