IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) D. Delivery Bears 二分+网络流
来源:互联网 发布:通用工具箱软件 编辑:程序博客网 时间:2024/05/16 17:14
题意:给一个图,每个边有边权,然后有x只熊,每个熊都要背负一样重量的货物,每头熊通过一条路径到i,每条边被所有熊经过的次数乘于货物重量不能大于边权,然后问你最大的货物总重量是多少,每只熊都必须要用,每个熊背负的货物重量一致,所以等价于求每只熊背负的货物的最大重量
思路:二分最大货物总重量,然后跑网络流
#include <cstdio>#include <queue>#include <cstring>#include <iostream>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <string>#include <set>#include <ctime>#include <cmath>#include <cctype>using namespace std;#define maxn 600#define INF 1<<29#define LL long longint cas=1,T;struct Edge{int from,to,cap,flow;Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}};int n,m,x;struct Dinic{//int n,m; int s,t;vector<Edge>edges; //边数的两倍vector<int> G[maxn]; //邻接表,G[i][j]表示结点i的第j条边在e数组中的序号bool vis[maxn]; //BFS使用int d[maxn]; //从起点到i的距离int cur[maxn]; //当前弧下标void init(){ for (int i=0;i<=n+2;i++) G[i].clear(); edges.clear();}void AddEdge(int from,int to,int cap){edges.push_back(Edge(from,to,cap,0));edges.push_back(Edge(to,from,0,0)); //反向弧int mm=edges.size();G[from].push_back(mm-2);G[to].push_back(mm-1);}bool BFS(){memset(vis,0,sizeof(vis));queue<int>q;q.push(s);d[s]=0;vis[s]=1;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 (!vis[e.to] && e.cap > e.flow){vis[e.to]=1;d[e.to] = d[x]+1;q.push(e.to);}}}return vis[t];}int DFS(int x,int a){if (x==t || a==0)return a;int flow = 0,f;for(int &i=cur[x];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)))>0){e.flow+=f;edges[G[x][i]^1].flow-=f;flow+=f;a-=f;if (a==0)break;}}return flow;}int Maxflow(int s,int t){this->s=s;this->t=t;int flow = 0;while (BFS()){memset(cur,0,sizeof(cur));flow+=DFS(s,INF);}return flow;}}dc;int u[maxn],v[maxn],c[maxn];bool check(double temp){dc.init();for (int i = 0;i<m;i++){ dc.AddEdge(u[i],v[i],min(c[i]/temp,1.0*x));}dc.AddEdge(0,1,x);dc.AddEdge(n,n+1,x);if (dc.Maxflow(0,n+1)==x)return true;return false;}int main(){//freopen("in","r",stdin);while (scanf("%d%d%d",&n,&m,&x)!=EOF){ for (int i = 0;i<m;i++)scanf("%d%d%d",&u[i],&v[i],&c[i]); double l=0,r=1e9;double ans=0; for (int i = 0;i<100;i++){double mid=(l+r)/2;if (check(mid))l=mid,ans=mid;elser=mid;}printf("%.10f\n",ans*x);}//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);return 0;}
0 0
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) D. Delivery Bears 二分+网络流
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) D - Delivery Bears,二分+最大流问题
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) D. Delivery Bears 二分+网络流(循环写二分,否则T。。。)
- 【IndiaHacks 2016 - Online Edition (Div 1 + Div 2) ErrichtoD】【二分答案 最大流】Delivery Bears x只熊运输同样的实物重量货物
- Codeforces IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) B. Bear and Compressing 暴力
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) A. Bear and Three Balls 水题
- CF# IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) C - Bear and Up-Down
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)B. Bear and Compressing
- codeforces IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) A. Bear and Three Balls
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) A B C
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) C. Bear and Up-Down
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) 653C Bear and Up-Down(暴力)
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) B. Bear and Compressing
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) 653B Bear and Compressing(dfs + stl)
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)-A - Bear and Three Balls-水题
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)-B - Bear and Compressing-暴力DP
- struts2中的constant配置
- 《Android源码设计模式解析与实》读书笔记
- Problem A: 输入字符串以及输出
- 解决OS X下Pycharm无法识别Python第三方库的问题
- centos下 mysql 安装及配置(快速入门版)
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) D. Delivery Bears 二分+网络流
- SVN服务端和客户端的说明与操作
- Java自动装箱和拆箱定义
- [分拣思想]——对象计数
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- 以文件为单位的分句、分词python封装脚本
- Hibernate学习——(十)继承映射
- 关于卡尔曼滤波视频目标跟踪的一个疑惑
- 二叉树的最大深度 & 二叉树的最小深度