题解:

求比值用分数规划,单个求太慢了套整体二分

然后求二分图最小割

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const double eps=1e-10;
const int maxn=1000;
const int oo=1000000000; int n,m;
int n1,m1;
double val[maxn]; int dcmp(double x){
if(fabs(x)<eps)return 0;
if(x<0)return -1;
else return 1;
} struct ShortestPath{
int rx[100009],ry[100009],s[100009],t[100009];
int cntedge;
int head[maxn];
int to[100009],nex[100009];
double dist[100009];
void Addedge(int x,int y,double z){
nex[++cntedge]=head[x];
to[cntedge]=y;
dist[cntedge]=z;
head[x]=cntedge;
} void readin(){
for(int i=1;i<=m;++i)scanf("%d%d%d%d",&rx[i],&ry[i],&t[i],&s[i]);
} queue<int>q;
int inq[maxn];
double d[maxn];
void Spfa(){
for(int i=1;i<=n;++i){
d[i]=oo;inq[i]=0;
}
inq[n]=1;d[n]=0;q.push(n);
while(!q.empty()){
int x=q.front();q.pop();inq[x]=0;
for(int i=head[x];i;i=nex[i]){
if(d[x]+dist[i]<d[to[i]]){
d[to[i]]=d[x]+dist[i];
if(!inq[to[i]]){
q.push(to[i]);
inq[to[i]]=1;
}
}
}
}
} int a[maxn],b[maxn],c[maxn];
void Div(int l,int r,double Lo,double Hi){
if(l>r)return;
if(dcmp(Lo-Hi)==0){
for(int i=l;i<=r;++i)val[a[i]]=Lo;
return;
}
double midans=(Lo+Hi)/2.0;
memset(head,0,sizeof(head));
cntedge=0;
for(int i=1;i<=m;++i)Addedge(rx[i],ry[i],t[i]-midans*s[i]);
Spfa();
int t1=0,t2=0;
for(int i=l;i<=r;++i){
if(d[a[i]]<=0){
b[++t1]=a[i];
}else{
c[++t2]=a[i];
}
}
for(int i=1;i<=t1;++i)a[l+i-1]=b[i];
for(int i=1;i<=t2;++i)a[l+t1+i-1]=c[i];
Div(l,l+t1-1,Lo,midans);
Div(l+t1,r,midans,Hi);
}
void Getst(){
for(int i=1;i<=n1;++i)a[i]=i;
for(int i=1;i<=n1;++i)val[i]=oo;
Div(1,n1,0,1000.0);
}
}P; struct NetworkFlow{
struct Edge{
int from,to;
double cap,flow;
};
vector<int>G[maxn];
vector<Edge>edges;
void Addedge(int x,int y,double z){
Edge e;
e.from=x;e.to=y;e.cap=z;e.flow=0;
edges.push_back(e);
e.from=y;e.to=x;e.cap=0;e.flow=0;
edges.push_back(e);
int c=edges.size();
G[x].push_back(c-2);
G[y].push_back(c-1);
} int s,t;
int d[maxn];
int vis[maxn];
queue<int>q;
int Bfs(){
memset(vis,0,sizeof(vis));
vis[s]=1;d[s]=0;q.push(s);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=0;i<G[x].size();++i){
Edge e=edges[G[x][i]];
if((dcmp(e.cap-e.flow)>0)&&(!vis[e.to])){
vis[e.to]=1;
d[e.to]=d[x]+1;
q.push(e.to);
}
}
}
return vis[t];
} double Dfs(int x,double a){
if((x==t)||(dcmp(a)==0))return a; double nowflow=0,f=0;
for(int i=0;i<G[x].size();++i){
Edge e=edges[G[x][i]];
if(d[x]+1==d[e.to]){
f=Dfs(e.to,min(a,e.cap-e.flow));
if(dcmp(f)>0){
nowflow+=f;
a-=f;
edges[G[x][i]].flow+=f;
edges[G[x][i]^1].flow-=f;
if(dcmp(a)==0)break;
}
}
}
return nowflow;
} double Maxflow(){
double flow=0;
while(Bfs())flow+=Dfs(s,oo*1.0);
return flow;
} void Sol(){
s=n1+1;t=s+1;
for(int i=1;i<=n1;++i){
if(i%2)Addedge(s,i,val[i]);
else Addedge(i,t,val[i]);
}
while(m1--){
int x,y;
scanf("%d%d",&x,&y);
if((dcmp(val[x]-1000)==0)&&(dcmp(val[y]-1000)==0)){
printf("-1\n");return;
}
Addedge(x,y,oo*1.0);
}
printf("%.1f\n",Maxflow());
}
}F; int main(){
scanf("%d%d",&n,&m);
P.readin();
scanf("%d%d",&m1,&n1);
P.Getst();
F.Sol();
return 0;
}

  

BZOJ 2285 [Sdoi2011]保密的更多相关文章

  1. bzoj 2285 [Sdoi2011]保密(二分,spfa + 最大流)

    Description 现在,保密成为一个很重要也很困难的问题.如果没有做好,后果是严重的.比如,有个人没有自己去修电脑,又没有拆硬盘,后来的事大家都知道了. 当然,对保密最需求的当然是军方,其次才是 ...

  2. 【BZOJ2285】[SDOI2011]保密(分数规划,网络流)

    [BZOJ2285][SDOI2011]保密(分数规划,网络流) 题面 BZOJ 洛谷 题解 首先先读懂题目到底在干什么. 发现要求的是一个比值的最小值,二分这个最小值\(k\),把边权转换成\(t- ...

  3. [BZOJ 2285] [SDOI 2011] 保密

    Description 传送门 Solution 这道题的最大难点在于读懂题意(雾 分数规划求出 \(n\) 到 \(1\cdots n_1\) 每个点的最小 \(\sum\frac{t_i}{s_i ...

  4. BZOJ 2243: [SDOI2011]染色 [树链剖分]

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6651  Solved: 2432[Submit][Status ...

  5. BZOJ 2286: [Sdoi2011]消耗战

    2286: [Sdoi2011消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2082  Solved: 736[Submit][Status] ...

  6. bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...

  7. BZOJ 2241: [SDOI2011]打地鼠 暴力

    2241: [SDOI2011]打地鼠 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pro ...

  8. bzoj 2244: [SDOI2011]拦截导弹 cdq分治

    2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 237  Solved: ...

  9. bzoj 2243 [SDOI2011]染色(树链剖分,线段树)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4637  Solved: 1726[Submit][Status ...

随机推荐

  1. 17. Getting to the essence of things

    17.Getting to the essence of things.抓住事情的本质 From today on, I think I should keep a diary. To the CCU ...

  2. mybatis-generator-plugin

    1.背景 这篇文章刚开始想着哪个分类呢?mybatis.idea或是maven呢,最后还是选择了mybatis.最初使用这个逆向工具是在eclipse上,使用的是eclispe上mbg插件执行配置ge ...

  3. 037、Java中利用判断语句实现三目运算的功能

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  4. eshop-环境配置

    1. iptables # Generated by iptables-save v1. :: #*filter #:INPUT ACCEPT [:] #:FORWARD ACCEPT [:] #:O ...

  5. getchar、scanf以及缓冲区的概念

      1.getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了.       getch()和getche( ...

  6. Json实体类驼峰名称转化器

    背景 我们常用一些网站,将json转化成实体类.但不巧的是,这些自动生成的都是小驼峰.需要进一步的改成大驼峰+JsonProperty.接着同事说他已经有个工具了.我稍微简化了一下 方法 首先行分离. ...

  7. 使用Ubuntu系统管理包工具(apt)部署Zabbix企业级监控系统

    使用Ubuntu系统管理包工具(apt)部署Zabbix企业级监控系统  作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Ubuntu系统部署笔记:https://www.cnblo ...

  8. 实训23 功能FC的建立与调用

    第4章:实训23 功能的生成与条用 功能简称FC 是用户编写的没有自己存储区的逻辑块 . 功能主要用来执行条用一次就可以完成的操作. 类似于C语言中的 函数 步骤一 单击确定 以后 出现了 在下面图框 ...

  9. 51nod 1293:球与切换器

    1293 球与切换器 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  取消关注 有N行M列的正方形盒子.每个盒子有三种状态0 ...

  10. 3D打印技术的火爆,真的会让传统模具行业没落吗?

    当一种新生事物出现时,人们除了赞美它带来的新畅想外,往往还会对"旧事物"贬低几分--各种淘汰观点总是不绝于耳.但可惜的是,新生事物取代旧事物的事儿并不会必然发生.比如,直到现在广播 ...