BZOJ 4055 Misc
比较复杂的一道DP。
设两点(i,j)之间最短路为dis[i][j],则

可转化为:

将该式前后分立,可得:

其中,
可以单独求出,后面的部分则需要DP。
设
为b(x),枚举i,并计算出从i出发的每个点的dis。
对于每个到达的点k,b(k)可从k相邻的点的b得出。
显然,在枚举过程中可以更新一波答案:
当然,别忘了更新b值:
代码:
#include <bits/stdc++.h>
#define sir(i, p) for(sides *i = star[p]; i; i = i -> aftr)
using namespace std;
const int N = 1e3 + ;
int n, m, l, r, a[N], q[N], dis[N], ind[N];
double pout[N];
long double bck[N], rnt[N];
priority_queue <pair <int, int> > queues;
bool vis[N];
struct sides {
int vv, sis;
sides *aftr;
long double ends;
}*star[N], lenss[N << ];
inline void moree (int x, int y, int z, double w) ;
void pushups (int x) ;
void solve (int x) {
dis[x] = ;
queues.push (make_pair (, x));
while (!queues.empty()) {
int u = queues.top().second;
queues.pop();
if (vis[u])
continue;
vis[u] = ;
sir (i, u)
if (dis[i -> vv] > dis[u] + i -> sis) {
dis[i -> vv] = dis[u] + i -> sis;
queues.push (make_pair (-dis[i -> vv], i -> vv));
}
}
return ;
}
void doit (int x) {
for (int p = r; p > ; p --) {
int u = q[p];
sir (i, u)
if(dis[i->vv] == dis[u]+i->sis) {
int v = i->vv; bck[u] += i->ends*bck[v];
}
pout[u] += a[x]*rnt[u]*bck[u];
bck[u] += (long double)a[u]/rnt[u];
}
return ;
}
int main() {
scanf ("%d%d", &n, &m);
for (int i = ; i <= n; i ++)
scanf("%d", &a[i]);
for (int i = ; i <= m; i ++) {
int x, y, z;
double w;
scanf("%d%d%d%lf", &x, &y, &z, &w);
moree(x, y, z, w);
}
for (int i = ; i <= n; i ++) {
memset (rnt, , sizeof rnt);
memset (bck, , sizeof bck);
memset (vis, , sizeof vis);
memset (dis, 0x3f, sizeof dis);
solve (i);
pushups (i);
doit (i);
}
for (int i = ; i <= n; i ++)
printf ("%.10f\n", pout[i]);
return ;
}
inline void moree (int x, int y, int z, double w) {
static int _; sides* ls;
ls = &lenss[++_];
ls -> vv = y;
ls -> sis = z;
ls -> ends = w;
ls -> aftr = star[x];
star[x] = ls;
ls = &lenss[++_];
ls -> vv = x;
ls -> sis = z;
ls -> ends = w;
ls -> aftr = star[y];
star[y] = ls;
return ;
}
void pushups (int x) {
q[r = ] = x;
l = ;
rnt[x] = ;
for (int i = ; i <= n; i ++)
sir (j, i) {
if (dis[i] + j -> sis == dis[j -> vv])
ind[j -> vv] ++;
}
while (r > l) {
int u = q[++ l];
sir(i, u)
if (dis[u] + i -> sis == dis[i -> vv]) {
if (!-- ind[i -> vv])
q[++r] = i -> vv;
rnt[i -> vv] += rnt[u] * i -> ends;
}
}
return ;
}
BZOJ 4055 Misc的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- 【splay】文艺平衡树 BZOJ 3223
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 ...
随机推荐
- Java实现 LeetCode 677 键值映射(字典树)
677. 键值映射 实现一个 MapSum 类里的两个方法,insert 和 sum. 对于方法 insert,你将得到一对(字符串,整数)的键值对.字符串表示键,整数表示值.如果键已经存在,那么原来 ...
- Java实现 LeetCode 672 灯泡开关 Ⅱ(数学思路问题)
672. 灯泡开关 Ⅱ 现有一个房间,墙上挂有 n 只已经打开的灯泡和 4 个按钮.在进行了 m 次未知操作后,你需要返回这 n 只灯泡可能有多少种不同的状态. 假设这 n 只灯泡被编号为 [1, 2 ...
- Java实现蓝桥杯模拟存储转换
问题描述 在计算机存储中,15.125GB是多少MB? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分. pac ...
- Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针
116. 填充每个节点的下一个右侧节点指针 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node { int val; Node *left ...
- Java实现LeetCode_0007_ReverseInteger
package javaLeetCode_primary; import java.util.Scanner; /** * Given a 32-bit signed integer, reverse ...
- 使用vw进行移动端适配(nuxt项目)
基于nuxt 2.0.0 一.安装postcss-px-to-viewport npm安装 npm install postcss-px-to-viewport --save-dev 或 yarn安装 ...
- akka-typed(7) - cluster:sharding, 集群分片
在使用akka-typed的过程中发现有很多地方都简化了不少,变得更方便了,包括:Supervision,只要用Behaviors.supervise()把Behavior包住,很容易就可以实现这个a ...
- [转] Ubuntu的apt-get 设置代理的方法
点击阅读原文 新立得软件管理器这种图形化的代理设置很明了,这里介绍下终端命令行的网络代理设置,这样大家就可以通过代理进行apt-get了. 方法一: 如果只是想临时使用http代理,可以在使用apt- ...
- @bzoj - 3148@ 没头脑和不高兴
目录 @description@ @solution@ @part 1:期望@ @part 2:方差@ @accepted code@ @details@ @description@ 没头脑和不高兴是 ...
- TensorFlow从0到1之TensorFlow常用激活函数(19)
每个神经元都必须有激活函数.它们为神经元提供了模拟复杂非线性数据集所必需的非线性特性.该函数取所有输入的加权和,进而生成一个输出信号.你可以把它看作输入和输出之间的转换.使用适当的激活函数,可以将输出 ...