原题传送门

比较复杂的一道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的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  3. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  4. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  5. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  6. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  7. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  8. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  9. 【splay】文艺平衡树 BZOJ 3223

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3  ...

随机推荐

  1. Java实现 LeetCode 677 键值映射(字典树)

    677. 键值映射 实现一个 MapSum 类里的两个方法,insert 和 sum. 对于方法 insert,你将得到一对(字符串,整数)的键值对.字符串表示键,整数表示值.如果键已经存在,那么原来 ...

  2. Java实现 LeetCode 672 灯泡开关 Ⅱ(数学思路问题)

    672. 灯泡开关 Ⅱ 现有一个房间,墙上挂有 n 只已经打开的灯泡和 4 个按钮.在进行了 m 次未知操作后,你需要返回这 n 只灯泡可能有多少种不同的状态. 假设这 n 只灯泡被编号为 [1, 2 ...

  3. Java实现蓝桥杯模拟存储转换

    问题描述 在计算机存储中,15.125GB是多少MB? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分. pac ...

  4. Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针

    116. 填充每个节点的下一个右侧节点指针 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node { int val; Node *left ...

  5. Java实现LeetCode_0007_ReverseInteger

    package javaLeetCode_primary; import java.util.Scanner; /** * Given a 32-bit signed integer, reverse ...

  6. 使用vw进行移动端适配(nuxt项目)

    基于nuxt 2.0.0 一.安装postcss-px-to-viewport npm安装 npm install postcss-px-to-viewport --save-dev 或 yarn安装 ...

  7. akka-typed(7) - cluster:sharding, 集群分片

    在使用akka-typed的过程中发现有很多地方都简化了不少,变得更方便了,包括:Supervision,只要用Behaviors.supervise()把Behavior包住,很容易就可以实现这个a ...

  8. [转] Ubuntu的apt-get 设置代理的方法

    点击阅读原文 新立得软件管理器这种图形化的代理设置很明了,这里介绍下终端命令行的网络代理设置,这样大家就可以通过代理进行apt-get了. 方法一: 如果只是想临时使用http代理,可以在使用apt- ...

  9. @bzoj - 3148@ 没头脑和不高兴

    目录 @description@ @solution@ @part 1:期望@ @part 2:方差@ @accepted code@ @details@ @description@ 没头脑和不高兴是 ...

  10. TensorFlow从0到1之TensorFlow常用激活函数(19)

    每个神经元都必须有激活函数.它们为神经元提供了模拟复杂非线性数据集所必需的非线性特性.该函数取所有输入的加权和,进而生成一个输出信号.你可以把它看作输入和输出之间的转换.使用适当的激活函数,可以将输出 ...