https://lydsy.com/JudgeOnline/problem.php?id=4055

题解

观察题目要我们求的东西:

\[ans[k]=\sum_{i}\sum_j \frac{a_i*a_j*f_k[i][j]}{f[i][j]}
\]

然后我们可以先枚举i,然后对于那个带限制的最短路部分,我们可以把贡献拆成两部分来计算。

\[ans[k]=\sum_{i}a_i*f[i][k]\sum_j\frac{a_j*f[k][j]}{f[i][j]}
\]

由于我们还要满足最短路的限制,所以我们可以先对每个i建出以i为源点的最短路\(DAG\)然后再\(DAG\)上维护后面的求和就可以了,这样可以保证是合法的。

Warning

维护f数组时注意一开始为了转移将\(f[i][i]=1\),最后做完了记得清空。

代码

#include<bits/stdc++.h>
#define N 1009
#define M 4009
#define mm make_pair
using namespace std;
typedef long long ll;
int head[N],tot,dis[N],du[N],n,m;
bool vis[N];
vector<int>vec[N];
vector<int>::iterator it;
priority_queue<pair<int,int> >q;
long double cnt[N][N],g[N],ans[N],a[N];
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
struct edge{
int n,to,l;double f;
}e[M<<1];
inline void add(int u,int v,int l,double f){
e[++tot].n=head[u];e[tot].to=v;head[u]=tot;e[tot].f=f;e[tot].l=l;
}
inline void link(int i,int u){
vec[u].push_back(i);du[e[i].to]++;
}
inline void dij(int s){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
q.push(mm(0,s));cnt[s][s]=1;dis[s]=0;
while(!q.empty()){
int u=q.top().second;q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=head[u];i;i=e[i].n){
int v=e[i].to;
if(dis[v]>dis[u]+e[i].l){
dis[v]=dis[u]+e[i].l;
cnt[s][v]=cnt[s][u]*e[i].f;
q.push(mm(-dis[v],v));
}
else if(dis[v]==dis[u]+e[i].l)cnt[s][v]+=cnt[s][u]*e[i].f;
}
}
}
inline void topsort(int s){
memset(g,0,sizeof(g));
queue<int>q;
for(int i=1;i<=n;++i)if(!du[i])q.push(i);
while(!q.empty()){
int u=q.front();q.pop();
ans[u]+=a[s]*cnt[s][u]*g[u];
g[u]+=a[u]/cnt[s][u];
for(it=vec[u].begin();it!=vec[u].end();++it){
int i=*it,v=e[i].to;
if(!--du[v])q.push(v);
g[v]+=g[u]*e[i].f;
}
}
}
int main(){
n=rd();m=rd();
for(int i=1;i<=n;++i)a[i]=rd();
int u,v,l;double f;tot=1;
for(int i=1;i<=m;++i){
u=rd();v=rd();l=rd();scanf("%lf",&f);
add(u,v,l,f);add(v,u,l,f);
}
for(int s=1;s<=n;++s){
dij(s);
cnt[s][s]=0;
for(int u=1;u<=n;++u)
for(int i=head[u];i;i=e[i].n)if(dis[u]+e[i].l==dis[e[i].to])link(i^1,e[i].to);
topsort(s);
for(int u=1;u<=n;++u)vec[u].clear();
}
for(int i=1;i<=n;++i)printf("%.8Lf\n",ans[i]);
return 0;
}

[Ctsc2015]misc的更多相关文章

  1. bzoj AC倒序

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

  2. sun.misc.BASE64Encoder找不到jar包的解决方法

    1.右键项目->属性->java bulid path->jre System Library->access rules->resolution选择accessible ...

  3. sun.misc.Unsafe的理解

    以下sun.misc.Unsafe源码和demo基于jdk1.7: 最近在看J.U.C里的源码,很多都用到了sun.misc.Unsafe这个类,一知半解,看起来总感觉有点不尽兴,所以打算对Unsaf ...

  4. 正则表达式匹配/data/misc/wifi/wpa_supplicant.conf的WiFi名称与密码

    正则表达式匹配/data/misc/wifi/wpa_supplicant.conf的WiFi名称与密码: String regex_name="ssid=\"(.*?)\&quo ...

  5. Java--如何使用sun.misc.Unsafe完成compareAndSwapObject原子操作

    package com; import sun.misc.Unsafe; import java.lang.reflect.Field; /** * Created by yangyu on 16/1 ...

  6. MyEclipse中无法识别 sun.misc.BASE64Encoder

    sun.misc.BASE64Encoder/BASE64Decoder类不属于JDK标准库范畴,但在JDK中包含了该类,可以直接使用.但是在MyEclipse中直接使用却找不到该类. 解决方法: 1 ...

  7. Java sun.misc.Unsafe类的学习笔记

    Java未开源的Unsafe类 Unsafe类可以为我们提供高效并且线程安全方式操作变量,直接和内存数据打交道. 获取Unsafe实体的方法 private static Unsafe getUnsa ...

  8. 教你一招 - Misc类型插件的妙用(附带插件源码)

    熟悉nopcommerce插件的朋友应该知道里面有一种Misc类型的插件,比如Nop.Plugin.Misc.WebServices和 Nop.Plugin.Misc.FacebookShop,继承自 ...

  9. linux设备驱动归纳总结(十):1.udev&misc【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-111839.html linux设备驱动归纳总结(十):1.udev&misc xxxxxxx ...

随机推荐

  1. 前端框架React入门课程【视频】

    视频教程列表: http://v1.mukewang.com/1a8228ac-5f7f-48de-b1c5-7d1b8bce9c77/L.mp4 1-1 React入门课程介绍 http://v1. ...

  2. 20190906 On Java8 第十八章 字符串

    第十八章 字符串 +的重载与StringBuilder 用于String的+与+=是Java中仅有的两个重载过的操作符,Java不允许程序员重载任何其他的操作符.编译器自动引入了java.lang.S ...

  3. VC调试方法大全

    VC调试方法大全 一.调试基础 调试快捷键 F5:  开始调试 Shift+F5: 停止调试 F10:   调试到下一句,这里是单步跟踪 F11:   调试到下一句,跟进函数内部 Shift+F11: ...

  4. 使用gitlab的webhook进行前端自动部署

    gitlab有个功能叫webhook,比较适合前端代码的自动部署.其中的逻辑在  http://172.30.83.152:30080/help/user/project/integrations/w ...

  5. python 操作ssh登录

    import paramiko #创建SSH对象 ssh = paramiko.SSHClient() #把要连接的机器添加到known_hosts文件中 ssh.set_missing_host_k ...

  6. 生日蛋糕 (poj1190) (dfs剪枝)

    [题目描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为 ...

  7. django信号相关

    Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 1.Django内置信号 Model signals pre_in ...

  8. C#设计模式:外观模式(Facade Pattern)

    一,什么是外观模式? 外观模式:为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用. 二,我们看看代码的实现 using System; using Syst ...

  9. 超详细的DOM操作(增删改查)

    操作DOM的核心就是增删改查 原文地址:https://jianshu.com/p/b0aa846f4dcc 目录 一.节点创建型API 1.1 createElement 1.2 createTex ...

  10. 行人重识别(ReID) ——基于深度学习的行人重识别研究综述

    转自:https://zhuanlan.zhihu.com/p/31921944 前言:行人重识别(Person Re-identification)也称行人再识别,本文简称为ReID,是利用计算机视 ...