Codeforces--653D--Delivery Bears(二分+最大流)
来源:互联网 发布:淘宝转化率怎么算 编辑:程序博客网 时间:2024/06/07 08:47
Description
Niwel is a little golden bear. As everyone knows, bears live in forests, but Niwel got tired of seeing all the trees so he decided to move to the city.
In the city, Niwel took on a job managing bears to deliver goods. The city that he lives in can be represented as a directed graph with n nodes and m edges. Each edge has a weight capacity. A delivery consists of a bear carrying weights with their bear hands on a simple path from node 1 to node n. The total weight that travels across a particular edge must not exceed the weight capacity of that edge.
Niwel has exactlyx bears. In the interest of fairness, no bear can rest, and the weight that each bear carries must be exactly the same. However, each bear may take different paths if they like.
Niwel would like to determine, what is the maximum amount of weight he can deliver (it's the sum of weights carried by bears). Find the maximum weight.
Input
The first line contains three integers n, m and x (2 ≤ n ≤ 50, 1 ≤ m ≤ 500, 1 ≤ x ≤ 100 000) — the number of nodes, the number of directed edges and the number of bears, respectively.
Each of the following m lines contains three integers ai, bi and ci (1 ≤ ai, bi ≤ n, ai ≠ bi, 1 ≤ ci ≤ 1 000 000). This represents a directed edge from node ai to bi with weight capacity ci. There are no self loops and no multiple edges from one city to the other city. More formally, for each i and j that i ≠ j it's guaranteed that ai ≠ aj or bi ≠ bj. It is also guaranteed that there is at least one path from node 1 to node n.
Output
Print one real value on a single line — the maximum amount of weight Niwel can deliver if he uses exactly x bears. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.
Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct if .
Sample Input
4 4 31 2 22 4 11 3 13 4 2
1.5000000000
5 11 231 2 32 3 43 4 54 5 61 3 42 4 53 5 61 4 22 5 31 5 23 2 30
10.2222222222
题意:n个点m条边,x只小熊,小熊要把东西从1点运到n点,但是每条边都有一定的权值,小熊运的东西不能超过边对应的权值,并且每只小熊搬运的东西都是一样的,每只小熊可能会选择不一样的路,求搬运的最多的货物有多少
明显是要二分的,每次枚举一个货物的重量,然后跑一边最大流,判断所有的小熊是否都可以到达,建图的时候可以加一步转化,把边权转化为最多通过的小熊的数量,最大流的返回值应该大于等于x
精度要考虑清楚,还是不要while了,时间会很长,直接跑100遍for循环,一直折半很快就可以把一个比较大的数变小,100次for足够把精度误差缩小
#include<cstdio>#include<cmath>#include<cstring>#include<queue>#include<algorithm>using namespace std;#define MAXN 6000#define MAXM 1000000#define INF 0x3f3f3f3fint n,m,x,cnt;int vis[MAXN],dis[MAXN],cur[MAXN],head[MAXN];int u[MAXN],v[MAXN],cap[MAXN];struct node{int u,v,cap,flow,next;}edge[MAXM];void add(int a,int b,int c){node E={a,b,c,0,head[a]};edge[cnt]=E;head[a]=cnt++;node E1={b,a,0,0,head[b]};edge[cnt]=E1;head[b]=cnt++;}bool BFS(int s,int t){queue<int>q;memset(vis,0,sizeof(vis));memset(dis,-1,sizeof(dis));q.push(s);vis[s]=1;dis[s]=0;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){node E=edge[i];if(E.cap>E.flow&&!vis[E.v]){vis[E.v]=1;dis[E.v]=dis[E.u]+1;if(E.v==t) return true;q.push(E.v);}}}return false;}int DFS(int x,int a,int t){if(a==0||x==t) return a;int flow=0,f;for(int &i=cur[x];i!=-1;i=edge[i].next){node &E=edge[i];if(dis[x]+1==dis[E.v]&&(f=DFS(E.v,min(E.cap-E.flow,a),t))>0){a-=f;flow+=f;edge[i].flow+=f;edge[i^1].flow-=f;if(a==0) break;}}return flow;}int MAXflow(int s,int t){int flow=0;while(BFS(s,t)){memcpy(cur,head,sizeof(head));flow+=DFS(s,INF,t);}return flow;}bool judge(double mid){cnt=0;memset(head,-1,sizeof(head));for(int i=0;i<m;i++)add(u[i],v[i],(int)min(x*1.0,cap[i]*1.0/mid));return MAXflow(1,n)>=x;}int main(){while(scanf("%d%d%d",&n,&m,&x)!=EOF){memset(u,0,sizeof(u));memset(v,0,sizeof(v));memset(cap,0,sizeof(cap));for(int i=0;i<m;i++)scanf("%d%d%d",&u[i],&v[i],&cap[i]);double l=0,r=1e10,mid;double ans=0;for(int i=0;i<=100;i++){mid=(l+r)/2;if(judge(mid)){ans=mid;l=mid;}elser=mid;}printf("%.10lf\n",ans*x);}return 0;}
- Codeforces--653D--Delivery Bears(二分+最大流)
- Codeforces 653D Delivery Bears 【二分+最大流】
- Codeforces 653 D Delivery Bears【二分+最大流】
- Codeforces(653D)-Delivery Bears(二分+最大流)
- Codeforces 653D:Delivery Bears 二分+网络流
- Codeforces 653D Delivery Bears【二分+网络流】
- CodeForces 653D Delivery Bears
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) D - Delivery Bears,二分+最大流问题
- CF 653D(Delivery Bears-网络流)
- cf653d 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。。。)
- codeforces 653D (二分 最大流)
- 【IndiaHacks 2016 - Online Edition (Div 1 + Div 2) ErrichtoD】【二分答案 最大流】Delivery Bears x只熊运输同样的实物重量货物
- CodeForces 653DDelivery Bears(网络流)
- codeforces 387D George and Interesting Graph(二分图最大匹配)
- CodeForces 589F Gourmet and Banquet(二分 + 最大流)
- CodeForces-907A Masha and Bears(想法水题)
- 即时通讯技术- 推送技术协议方案
- 【Linux 学习笔记】戏说Git (上)
- 最长上升子列~
- HDU 4847 Wow! Such Doge! (注意输入格式!)
- 未解之谜:gb2312如何转到utf-8
- Codeforces--653D--Delivery Bears(二分+最大流)
- slf4j用法
- Listview Checkbox错乱问题
- 融云 rongyun
- POJ 3230 DP
- RAID阵列与LVM逻辑卷组创建
- 微信支付
- 《剑指offer》-树的子结构
- 336. Palindrome Pairs(C++实现)