首先要发现起点相同的情况下,到其他点的最优路径也是相同的

所以就变成了求起点到n1个点的最优路径,

最优的方案是走过的边v1和/v2和最小

分数规划的标准形式

然后就可以二分+spfa(二分区间是0到10,因为最差情况是1+1+1/10+10+10=1/10和10+10+10/1+1+1=10)

然后无解就是二分出界也没办法得到值,起点到他的花费就设为inf

然后第二问是加权最小边覆盖问题,是np,,但他是二分图,所以就变成了边要么是属于左端点,要么是属于右端点,就是最大权闭合子图(最小割)

注:spfa要提前剪枝,不然会被卡

码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
#define inf 1000000009
#define N  300000
queue<int>q;
vector<int>V[N],Q[N],Z[N];
vector<double>T[N],S[N];int a,b,t,s,yuan[N],zhong[N],tot=-1,n,m,hou[N],xia[N],m1,n1;
bool vis[N];
double l,r,v[N],ans[N],d[N];
void jian(int a,int b,double c)
{++tot,hou[tot]=yuan[a],yuan[a]=tot;zhong[tot]=b,v[tot]=c;
}
void jia(int a,int b,double c)
{jian(a,b,c);jian(b,a,0);
}
double spfa(int t,double cc)
{int i,j;for(i=1;i<=n;i++)d[i]=-inf;d[n]=0;q.push(n);while(!q.empty()) {int st=q.front();vis[st]=0;q.pop();for(i=0;i<V[st].size();i++){int nd=V[st][i];double k=cc*S[st][i]-T[st][i];if(d[nd]<d[st]+k){d[nd]=d[st]+k;if(nd==t&&d[t]>0)return 1;if(vis[nd]==0){
vis[nd]=1;q.push(nd);      }       }   }   }return d[t];
}
bool bfs()
{
int i;
memset(d,0x7f,sizeof(d));
for(i=1;i<=t;i++)
xia[i]=yuan[i];
d[s]=0;
q.push(s);while(!q.empty())
{int st=q.front();q.pop();for(i=xia[st];i!=-1;i=hou[i]){int nd=zhong[i];if(fabs(v[i]-0)<=0.000001||d[nd]<inf)continue;d[nd]=d[st]+1;q.push(nd);}
}   return d[t]<inf;
}
double dfs(int o,int t,double limit)
{if(!limit||o==t)return limit;int i;double f,flow=0;for(i=xia[o];i!=-1;i=hou[i]){xia[o]=i;int nd=zhong[i];if(d[nd]==d[o]+1&&fabs((f=dfs(nd,t,min(limit,v[i])))-0)>0.000001){flow+=f;limit-=f;v[i]-=f;v[i^1]+=f;if(fabs(limit-0)<=0.000001)break;       }       }   return flow;
}
double dinic()
{double daan=0;while(bfs()){   daan+=dfs(s,t,inf);}  return daan;
}
int main()
{memset(yuan,-1,sizeof(yuan));scanf("%d%d",&n,&m);int i;double l1,l2;for(i=1;i<=m;i++){scanf("%d%d%lf%lf",&a,&b,&l1,&l2);V[a].push_back(b);T[a].push_back(l1);S[a].push_back(l2);                }scanf("%d%d",&m1,&n1);for(i=1;i<=n1;i++){l=0;r=12;while(l+0.00000001<r){double mid=(l+r)/2;       if(spfa(i,mid)<0){l=mid+0.000001;}else r=mid;}ans[i]=l;if(l>11)ans[i]=inf;}tot=-1;for(i=1;i<=m1;i++){scanf("%d%d",&a,&b);      jia(a,b,inf);}s=n1+1;t=n1+2;for(i=1;i<=n1;i++){if(i%2){jia(s,i,ans[i]);          }else{jia(i,t,ans[i]);}}double daan=dinic();if(daan+0.00000001>=inf)printf("-1");else printf("%.1lf",daan);
}                 

bzoj2285 [SDOI2011]保密 分数规划spfa+最小割相关推荐

  1. AcWing2279 网络战争 (01分数规划+网络流 最小割模型)

    原题链接:AcWing2279 网络战争 题目大意 给一个无向带权图,求将s和t分开的一个边割集,使得割集的平均边权最小,即最小化∑e∈cwe∣c∣\frac{\sum_{e\in c} w_e}{| ...

  2. 【bzoj1486】[HNOI2009]最小圈 分数规划+Spfa

    题目描述 样例输入 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 3 样例输出 3.66666667 题解 分数规划+Spfa判负环 二分答案mid,并将所有边权减去mid,然后再判 ...

  3. BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 23822  Solved: 6012 [Submit ...

  4. 【bzoj1690】[Usaco2007 Dec]奶牛的旅行 分数规划+Spfa

    题目描述 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城市地图,上面标 ...

  5. BZOJ3597 SCOI2014方伯伯运椰子(分数规划+spfa)

    即在总流量不变的情况下调整每条边的流量.显然先二分答案变为求最小费用.容易想到直接流量清空跑费用流,但复杂度略有些高. 首先需要知道(不知道也行?)一种平时基本不用的求最小费用流的算法--消圈法.算法 ...

  6. 【BZOJ】1690: [Usaco2007 Dec]奶牛的旅行(分数规划+spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1690 第一题不是水题的题.. 分数规划.. T-T 百度吧..http://blog.csdn.ne ...

  7. POJ3621 Sightseeing Cows 分数规划 SPFA求最小环

    题意:给点数边数点权wi和边权ci,求一个环,使得∑wi / ∑ci最大. 解:分数规划,设ans为答案,则二分时边权设置为mid*ci - wi, 1.     易证明所求环一定为一个简单环,因为两 ...

  8. SCOI2014方伯伯运椰子 (分数规划+SPFA)

    题目描述 四川的方伯伯为了致富,决定引进海南的椰子树.方伯伯的椰子园十分现代化,椰子园中有一套独特的交通系统. 现在用点来表示交通节点,边来表示道路.这样,方伯伯的椰子园就可以看作一个有 n + 2 ...

  9. bzoj 1690: [Usaco2007 Dec]奶牛的旅行——分数规划+spfa判负环

    Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城 ...

最新文章

  1. 几种流行Webservice框架性能对比
  2. cmake 版本 arm_在 ARM 架构服务器上编译 Greenplum6并制作rpm安装包
  3. 使用Rainbow tables和Ophcrack的组合工具破解Windows密码
  4. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - B. 星系炸弹
  5. 【BZOJ1814】Ural 1519 Formula 1 插头DP
  6. java object 转byte_Java将对象Object转换成Byte字节数组
  7. Python实现自动推本地github博客到远程仓库
  8. 天池 在线编程 高效作业处理服务(01背包DP)
  9. EFCore-一对一配置外键小记
  10. 高通linux系统交叉编译,【Linux】第三章 移植开源库
  11. 未成年人互联网普及率达99% 腾讯等倡议加强青少年网络素养教育
  12. Python中为啥 ‘abcd‘<‘ad‘ 答案他来啦
  13. 从C语言到C++的进阶之面向对象、using与命名空间(篇四)
  14. 【计算机组成原理笔记】计算机的基本组成
  15. 易用宝项目记录day1-springdatajpa
  16. 鸿蒙OS分布式任务调度,鸿蒙子系统解读-分布式任务调度篇(下)
  17. python, numpy中的.tile方法解释
  18. ArcEngine创建平头缓冲区的方法
  19. python之函数Type hinting
  20. Java二维数组实现学生管理系统

热门文章

  1. mysql 闪回查询 sql_利用闪回查看Oracle表历史时刻数据
  2. python xposed_xposed + python 怎么爬取微信朋友圈的数据
  3. vscode 执行npm命令_生产力终极指南:用了两年,如今才算真正会用VS Code
  4. SpykeTorch: Efficient Simulation of Convolutional Spiking Neural Networks With at Most One Spike per
  5. R Studio更换外部包镜像的方法
  6. c++实验4—项目6输出星号图
  7. 计算机专业汇报与接口,计算机接口设计实验总结.doc
  8. Linux安装Bitbucket7.6.0教程-绝对干货满满
  9. python3.7.3配置环境变量_配置环境变量切换到python3.7
  10. ol+天地图+geoserver_GeoServer的WMS服务加载到天地图