原题传送门

比较复杂的一道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 685 冗余连接 II(并查集+有向图)

    685. 冗余连接 II 在本问题中,有根树指满足以下条件的有向图.该树只有一个根节点,所有其他节点都是该根节点的后继.每一个节点只有一个父节点,除了根节点没有父节点. 输入一个有向图,该图由一个有着 ...

  2. 第十届蓝桥杯JavaB组省赛真题

    试题 A: 组队 本题总分:5 分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容. 每位球员担任 1 号位至 5 号位时的评分如下表所示. ...

  3. Java实现 LeetCode 593 有效的正方形(判断正方形)

    593. 有效的正方形 给定二维空间中四点的坐标,返回四点是否可以构造一个正方形. 一个点的坐标(x,y)由一个有两个整数的整数数组表示. 示例: 输入: p1 = [0,0], p2 = [1,1] ...

  4. Java实现 LeetCode 449 序列化和反序列化二叉搜索树

    449. 序列化和反序列化二叉搜索树 序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建. 设计一个算法 ...

  5. SQL Server实现 LeetCode 176 第二高的薪水

    176. 第二高的薪水 SQL架构 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+- ...

  6. Java实现 蓝桥杯VIP 算法提高 分苹果

    算法提高 分苹果 时间限制:1.0s 内存限制:256.0MB 问题描述 小朋友排成一排,老师给他们分苹果. 小朋友从左到右标号1-N.有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li ...

  7. java实现第六届蓝桥杯生成回文数

    生成回文数 所谓回文数就是左右对称的数字,比如: 585,5885,123321- 当然,单个的数字也可以算作是对称的. 小明发现了一种生成回文数的方法: 比如,取数字19,把它与自己的翻转数相加: ...

  8. java实现第四届蓝桥杯猜灯谜

    猜灯谜 题目描述 A 村的元宵节灯会上有一迷题: 请猜谜 * 请猜谜 = 请边赏灯边猜 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字. 请你用计算机按小明的思路算一下,然后提交&quo ...

  9. Grafana 插件地图Worldmap不显示

    介绍 最近上了ELK 日志分析,想着手看下用户的分布情况,在kibana 中展示用户分布情况是没有问题的,但是索引添加到Granfana 中的话就无法展示. 问题描述 添加ES索引以后,map地图一片 ...

  10. ThinkPHP6.0 + Vue + ElementUI + axios 的环境安装到实现 CURD 操作!

    官方文档地址: ​ ThinkPHP6.0: https://www.kancloud.cn/manual/thinkphp6_0/1037479 ​ ElemetUI: https://elemen ...