原题传送门

比较复杂的一道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 457 环形数组循环

    457. 环形数组循环 给定一个含有正整数和负整数的环形数组 nums. 如果某个索引中的数 k 为正数,则向前移动 k 个索引.相反,如果是负数 (-k),则向后移动 k 个索引.因为数组是环形的, ...

  2. Java实现 LeetCode 341 扁平化嵌套列表迭代器

    341. 扁平化嵌套列表迭代器 给你一个嵌套的整型列表.请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的每一项或者为一个整数,或者是另一个列表.其中列表的元素也可能是整数或是其他列 ...

  3. java实现拼出漂亮的表格

    /* * 在中文 Windows 环境下,控制台窗口中也可以用特殊符号拼出漂亮的表格来. 比如: ┌─┬─┐ │ │ │ ├─┼─┤ │ │ │ └─┴─┘ 其实,它是由如下的符号拼接的: 左上 = ...

  4. java实现第四届蓝桥杯有理数类

    有理数类 题目描述 有理数就是可以表示为两个整数的比值的数字.一般情况下,我们用近似的小数表示.但有些时候,不允许出现误差,必须用两个整数来表示一个有理数. 这时,我们可以建立一个"有理数类 ...

  5. java实现第五届蓝桥杯李白打酒

    李白打酒 题目描述 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店5 ...

  6. 用struts的action运行jsp页面

    struts是开源框架.使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间.如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,struts是一个不错的 ...

  7. jQuery实现购物车商品数量及总价的计算

    记录一下项目中遇到的计算购物车商品数量和总价的jQuery代码,重点在于选择器以及.text()命令的使用. 先上效果图,点击加减,商品数量以及总价会发生相应变化. html代码: <div c ...

  8. IE6 中png背景透明的最好方法

    应用方式:(网站尾部加上如下代码) <!--[if IE 6]> <script src="js/DDPngMin.js"></script> ...

  9. WPS2016ProPlus_normal 安装包+序列号

    WPS OFFICE 2016 安装 链接:https://pan.baidu.com/s/1dfjNFDxcl1n2fvYTt9c86A 提取码: ij8e 下载解压:.txt是序列号,.exe是安 ...

  10. 【asp.net core 系列】10 实战之ActionFilter

    0.前言 在上一篇中,我们提到了如何创建一个UnitOfWork并通过ActionFilter设置启用.这一篇我们将简单介绍一下ActionFilter以及如何利用ActionFilter,顺便补齐一 ...