洛咕 P2494 [SDOI2011]保密
出题人没素质啊,强行拼题还把题面写得又臭又长。
简单题面就是有一张图,每条边有两个权值\(t,s\),有无限支军队,一支军队可以打一个点,代价是从n到这个点的路径的\(\frac{\sum t}{\sum s}\)。
有m条限制,每条限制就是a,b两个点至少选一个,求最小代价。
首先第一部分也就是要求每个点的代价,显然分数规划,随便做做就没了。
第二部分就是裸的最小割,随便做做就没了。
#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
#define maxn 710
int n,m;
struct edge{int d,t,s;};
std::vector<edge>G[maxn];
double W[maxn],dist[maxn];int s[maxn],_s[maxn];
il vd SPFA(double Mid){
static bool inq[maxn];
static int que[maxn],hd,tl;
for(int i=1;i<=n;++i)dist[i]=1e9;
hd=tl=0;que[tl++]=n;dist[n]=0;
while(hd^tl){
int x=que[hd];
for(int i=0;i<G[x].size();++i)
if(dist[G[x][i].d]>dist[x]+G[x][i].t-Mid*G[x][i].s){
dist[G[x][i].d]=dist[x]+G[x][i].t-Mid*G[x][i].s;
if(!inq[G[x][i].d])inq[G[x][i].d]=1,que[tl++]=G[x][i].d,tl%=maxn;
}
inq[x]=0;++hd;hd%=maxn;
}
}
il vd solve(int l,int r,double L,double R){
if(R-L<1e-3){
L=(L+R)*0.5;
for(int i=l;i<=r;++i)W[s[i]]=L;
return;
}
if(l>r)return;
double Mid=(L+R)*0.5;
SPFA(Mid);
int _l=l-1,_r=r+1;
for(int i=l;i<=r;++i)
if(dist[s[i]]<0)_s[++_l]=s[i];
else _s[--_r]=s[i];
memcpy(s+l,_s+l,4*(r-l+1));
solve(l,_l,L,Mid);
solve(_r,r,Mid,R);
}
#define maxm 100000
int fir[maxn],head[maxn],dep[maxn],dis[maxm],nxt[maxm],id=1,S=maxn-1,T=maxn-2;double w[maxm];
il vd link(int a,int b,double c){
nxt[++id]=fir[a],fir[a]=id,dis[id]=b,w[id]=c;
nxt[++id]=fir[b],fir[b]=id,dis[id]=a,w[id]=0;
}
il bool BFS(){
static int que[maxn],hd,tl;
hd=tl=0;que[tl++]=S;
memset(dep,0,sizeof dep);dep[S]=1;
while(hd^tl){
int x=que[hd++];
for(int i=fir[x];i;i=nxt[i])
if(w[i]>1e-5&&!dep[dis[i]])
dep[dis[i]]=dep[x]+1,que[tl++]=dis[i];
}
return dep[T];
}
il double Dinic(int x,double maxflow){
if(x==T)return maxflow;
double ret=0;
for(int i=fir[x];i;i=nxt[i])
if(w[i]>1e-5&&dep[dis[i]]==dep[x]+1){
double d=Dinic(dis[i],std::min(w[i],maxflow-ret));
w[i]-=d,w[i^1]+=d,ret+=d;
if(maxflow-ret<1e-6)break;
}
return ret;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("2494.in","r",stdin);
freopen("2494.out","w",stdout);
#endif
n=gi(),m=gi();
int a,b,_t,_s;
while(m--)a=gi(),b=gi(),_t=gi(),_s=gi(),G[a].push_back((edge){b,_t,_s});
for(int i=1;i<n;++i)s[i]=i;
solve(1,n-1,0,7777);
for(int i=1;i<=n;++i)if(W[i]>7776)W[i]=1e9;
int m1=gi(),n1=gi();
for(int i=1;i<=n1;i+=2)link(S,i,W[i]);
for(int i=2;i<=n1;i+=2)link(i,T,W[i]);
while(m1--)a=gi(),b=gi(),link(a,b,1e9);
double ans=0;while(BFS())memcpy(head,fir,sizeof fir),ans+=Dinic(S,1e9);
if(ans>9e8)puts("-1");
else printf("%.1lf\n",ans);
return 0;
}
洛咕 P2494 [SDOI2011]保密的更多相关文章
- 洛谷2494 [SDOI2011]保密 (分数规划+最小割)
自闭一早上 分数规划竟然还能被卡精度 首先假设我们已经知道了到每个出入口的时间(代价) 那我们应该怎么算最小的和呢? 一个比较巧妙的想法是,由于题目规定的是二分图. 我们不妨通过最小割的形式. 表示这 ...
- 【BZOJ2285】[SDOI2011]保密(分数规划,网络流)
[BZOJ2285][SDOI2011]保密(分数规划,网络流) 题面 BZOJ 洛谷 题解 首先先读懂题目到底在干什么. 发现要求的是一个比值的最小值,二分这个最小值\(k\),把边权转换成\(t- ...
- 洛咕3312 [SDOI2014]数表
洛咕3312 [SDOI2014]数表 终于独立写出一道题了...真tm开心(还是先写完题解在写的) 先无视a的限制,设\(f[i]\)表示i的约数之和 不妨设\(n<m\) \(Ans=\su ...
- 洛咕 P3700 [CQOI2017]小Q的表格
洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...
- 洛咕 P2336 [SCOI2012]喵星球上的点名
洛咕 P2336 [SCOI2012]喵星球上的点名 先求出SA和height,一个点名串对应的就是一段区间,还有很多个点,就转化成了 有很多个区间,很多个点集,对每个区间计算和多少个点集有交,对每个 ...
- 洛咕 P4131 [WC2005]友好的生物
洛咕 P4131 [WC2005]友好的生物 首先可以发现\(C\)是没有用的,可以乘进所有的权值里面做 考虑没有最后一维的限制,那么两个生物的友好值就是 \(\sum_{i=1}^k|a_i-b_i ...
- 洛咕 P4528 [CTSC2008]图腾
洛咕 P4528 [CTSC2008]图腾 神题orz. 先约定abcd表示\(1\leq A<B<C<D\leq n\),而且\(y_a,y_b,y_c,y_d\)的排名正好是\( ...
- 洛咕P3250 [HNOI2016]网络 整体二分
这题太神仙了必须写博客... 显然可以想到二分答案.二分一个答案mid,如果所有长度\(\geq mid\)的路径都过x,那么答案一定\(<mid\),否则答案\(\geq mid\). 那么就 ...
- 洛咕 P2480 [SDOI2010]古代猪文
洛咕 P2480 [SDOI2010]古代猪文 题目是要求\(G^{\sum_{d|n}C^d_n}\). 用费马小定理\(G^{\sum_{d|n}C^d_n\text{mod 999911658} ...
随机推荐
- extjs 可视化开发工具
不清楚Ext可视化的可以看一下http://www.screencast.com/users/JackSlocum这里的三个视频哈. 安装和汉化的步骤 第一步下载:Ext需要支持AIR的支持 下载并安 ...
- 我们是如何拿下Google和Facebook Offer的?
http://posts.careerengine.us/p/57c3a1c1a09633ee7e57803c 大家好,我是小高,CMU CS Master,来Offer第一期学员,2014年初在孙老 ...
- Linux partprobe命令详解
partprobe命令 partprobe: 通知系统分区表的变化 常用的命令展示: 查看帮助 [root@localhost omc]# partprobe --help Usage: partpr ...
- [转]CentOS7增加或修改SSH端口号
前言:开启某服务或软件的端口,要从该服务或软件监听的端口(多以修改配置文件为主),SeLinux和防火墙(FireWall)的安全策略下手.如果使用阿里云,腾讯等第三方服务器还需要对管理控制台的安全组 ...
- HDU1407 测试你是否和LTC水平一样高
题目大意:给出一个num,计算方程x^2+y^2+z^2 = num的第一个正整数解(字典序),0 < num <= 10000. 方法参考了网上的博客,自己打了一波,发现还有很多不懂的地 ...
- 手写阻塞队列(Condition实现)
自己实现阻塞队列的话可以采用Object下的wait和notify方法,也可以使用Lock锁提供的Condition来实现,本文就是自己手撸的一个简单的阻塞队列,部分借鉴了JDK的源码.Ps:最近看面 ...
- Mysql数据库字符集问题
修改mysql数据库的默认编码方式 修改my.ini文件 加上 default-character-set=gb2312 设定数据库字符集 alter database da_name default ...
- mkdirp——递归创建目录及其子目录
如果要创建目录A并创建目录A的子目录B,没有用-p参数的情况下mkdir会逐个创建目录(mkdir A; mkdir A/B); 加上参数-p就可以直接创建2个目录mkdir -p A/B( 如果目录 ...
- P2418 yyy loves OI IV
题目背景 某校2015届有两位OI神牛,yyy和c01. 题目描述 全校除他们以外的N名学生,每人都会膜拜他们中的某一个人.现在老师要给他们分宿舍了.但是,问题来了: 同一间宿舍里的人要么膜拜同一位大 ...
- logstash 匹配日志格式
2017-05-15 12:06:17 INFO me.cinyi.imapp.push.commons.iospush - 用户ID[1000]-标识[11500], admin推送通知成功, ...