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 594 最长和谐子序列(滑动窗口)
594. 最长和谐子序列 和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1. 现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度. 示例 1: 输入: [1,3, ...
- Java实现 LeetCode 140 单词拆分II
class Solution { public List<String> wordBreak(String s, List<String> wordDict) { List&l ...
- java实现第七届蓝桥杯机器人塔
机器人塔 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似: A B B A B A A A B B B B B A B A B A B B A 队内的组塔规则是: A ...
- Mac下如何连接linux服务器(SSH)-比较好用的SSH工具推荐
Mac下如何连接linux服务器(SSH) 1.用mac自带终端连接 步骤如下: 打开终端,在顶部shell菜单中选择新建远程连接 在右侧服务器窗口点击+号,添加服务器,输入IP等信息 输入用户名,点 ...
- 【整理】JVM知识点大梳理
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.引入Java语 ...
- HashMap解析(主要JDK1.8,附带1.7出现的问题以及区别)
按问题的形式来吧,这些大多是我自己总结的,如有错误请及时指正谢谢 1.你了解HashMap么,可以说说么? 首先,HashMap是一种数据结构,可以快速的帮我们存取数据.它的底层数据结构在1.7和1. ...
- 第03组 Alpha(2/4)
队名:不等式方程组 组长博客 作业博客 团队项目进度 组员一:张逸杰(组长) 过去两天完成的任务: 文字/口头描述: 制定了初步的项目计划,并开始学习一些推荐.搜索类算法 GitHub签入纪录: 暂无 ...
- 洛谷P1255 数楼梯
题目描述 楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶. 编一个程序,计算共有多少种不同的走法. 分析与代码 走n阶楼梯,无论是走一次走1阶还是2阶,总得迈出一步, 所以求n阶楼梯 ...
- iOS-UIViewController创建的几种方法和UIWindow的介绍
在上一篇笔记中<iOS-程序启动原理和UIApplication>,http://blog.csdn.net/yang198907/article/details/49735531 在程序 ...
- 03-Python基础2
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...