幻想乡三连C:狂飙突进的幻想乡
题解:
不难发现,对于每一条从$S$到$T$的路径,设其$x、y$的和为$S_x、S_y$,其对答案的贡献是$a\cdot S_x+(1-a)\cdot S_y$,这是一个关于$a$的一次函数。而所有的路径就对应着许多$a\in [0,1]$直线,而不同$a$所对应的最短路长度恰好构成了这些直线的上凸壳,而求最短路的期望就是求上凸壳的积分(与坐标系横轴所夹面积),考虑到$n、m$很小,所以直接用一次函数不断拟合,每次求点值暴力跑一边最短路即可。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define M 802
#define N 202
#define INF 1010000000
#define eps (1e-5)
using namespace std;
int read(){
int nm=0,fh=1; char cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
struct STA{
int nd; double dst;
STA();
STA(int _nd,int _dst){nd=_nd,dst=_dst;}
bool operator <(const STA&ot)const{return dst>ot.dst;}
};
priority_queue<STA> Q;
int n,m,X[M],Y[M],fs[N],nt[M],to[M],tmp,S,T;
double dis[N];
bool vis[N];
void link(int x,int y,int t1,int t2){nt[tmp]=fs[x],fs[x]=tmp,to[tmp]=y,X[tmp]=t1,Y[tmp++]=t2;}
double DJ(double V){
for(int i=1;i<=n;i++) dis[i]=INF*1.0,vis[i]=false;
while(!Q.empty()) Q.pop(); dis[S]=0.0,Q.push(STA(S,0.0));
while(!Q.empty()){
int x=Q.top().nd; Q.pop();
if(vis[x]) continue; vis[x]=true;
for(int i=fs[x];i!=-1;i=nt[i]){
double dt=dis[x]+(X[i]*V)+(Y[i]*(1.0-V));
if(dt>=dis[to[i]]) continue;
dis[to[i]]=dt,Q.push(STA(to[i],dt));
}
}
return dis[T];
}
double calc(double L,double R){
double mid=(L+R)/2.0,ans,ls,rs;
ans=DJ(mid),ls=DJ(L),rs=DJ(R);
if(fabs(ans-(ls+rs)/2.0)*(R-L)<eps) return ans*(R-L);
return calc(L,mid)+calc(mid,R);
}
int main(){
n=read(),m=read(),S=read(),T=read(),memset(fs,-1,sizeof(fs));
for(int i=1;i<=m;i++){
int u=read(),v=read(),t1=read(),t2=read();
link(u,v,t1,t2),link(v,u,t1,t2);
}
printf("%.10f\n",calc(0.0,1.0)); return 0;
}
幻想乡三连C:狂飙突进的幻想乡的更多相关文章
- 2016北京集训测试赛(九)Problem C: 狂飙突进的幻想乡
Solution 我们发现, 对于一条路径来说, 花费总时间为\(ap + q\), 其中\(p\)和\(q\)为定值. 对于每个点, 我们有多条路径可以到达, 因此对于每个区间中的\(a\)我们可以 ...
- 幻想乡三连A:五颜六色的幻想乡
非常直接地构造 由于答案与生成树计数有关,所以一定要使用矩阵树定理,但这样就不能限制每种颜色的便使用的数量 我们构造$N^2$个关于$Ans_{x,y}$的方程,枚举将红色的边拆成$x$条,将蓝色的边 ...
- 幻想乡三连B:连在一起的幻想乡
$G[k][x]$表示所有$x$个点的无向图中每一个图的边数的$k$次方之和. $F[k][x]$就是在$G[k][x]$的基础上加了一个整体连通的性质. 有一个经典的套路就是对于$F$在对应的$G$ ...
- BZOJ4596: [Shoi2016]黑暗前的幻想乡
Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪 ...
- bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 559 Solved: 325[Submit][Sta ...
- [SHOI2016]黑暗前的幻想乡
Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪 ...
- bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 464 Solved: 264[Submit][Sta ...
- [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)
这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...
- 【BZOJ 4596】 4596: [Shoi2016]黑暗前的幻想乡 (容斥原理+矩阵树定理)
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 324 Solved: 187 Description ...
随机推荐
- ios 10 sticker pack application
看了WWDC2016直播,我们发现变得谨慎而开放的苹果在新一版四大平台系统中展示了很多变化,当然重中之重还是伟大的iOS.通过试用iOS10beta版,除了长大了的更强大的Siri主要感受到iMess ...
- 用android studio创建第一个安卓程序加载html5 页面
前言 软件版本:android studio v1.0正式版,由于v0.x以来软件变化一直比较大,很多问题搜索的解决方案也都是v0.x版本时代的,故首先声明一下版本. 动机:由于工作中需要对移动端软件 ...
- XmlDocument和XDocument转String
1:XDocument转String直接使用ToString();XNode里面重写了ToString()方法 2:XmlDocument转String需要写代码 using System; usin ...
- x-www-form-urlencoded名字的由来
1 提交的是表单数据 所以用form. 2 提交的形式是以参数放在url后面的形式提交的 例如,以x1=y1&x2=y2&x3=y3的形式放在url后面的形式提交,所以是urlenco ...
- Python菜鸟之路:Python基础-类(1)——概念
什么是类? 在python中,把具有相同属性和方法的对象归为一个类(class).类是对象的模板或蓝图,类是对象的抽象化,对象是类的实例化.类不代表具体的事物,而对象表示具体的事物. 类的创建 cla ...
- (转)Javascript模块化编程(三):require.js的用法
这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的 ...
- spring 注解事务
前提:在applicationContext.xml中配置<tx:annotation-driven transaction-manager="transactionManager&q ...
- butterknif
// butterknife public class ButterknifeActivity extends Activity { @butterknife.Bind(R.id.tv_title) ...
- php正则表达式和数组
一.正则表达式 1. “/”代表定界符,"^"代表起始符号,"$"代表结束符号 $str1="abc123def45ghjk6789lou" ...
- IOS int NSInteger NSNumber区分
1.NSNumber 是一个类继承于NSValue 即一个基本数据类型的集合 包括char a signed or unsigned char, short int, int, long int, l ...