Codeforces 653D Delivery Bears 【二分+最大流】
2016-03-21 21:09
435 查看
题目链接:Codeforces 653D Delivery Bears
题意:有n个点m条有向边带权图,权值代表该路径允许通过的最大物品重量。现在你要用x个小熊同时从点1到点n运物品,要求每个小熊运的物品重量相等。问所有小熊可以运送的最大重量和。
思路:不小心精度卡死我了。建图没什么好说的,新图的边权就是用路径的权值除以当前二分的值再向下取整。我们跑一发最大流,看是否满流。
AC代码:
题意:有n个点m条有向边带权图,权值代表该路径允许通过的最大物品重量。现在你要用x个小熊同时从点1到点n运物品,要求每个小熊运的物品重量相等。问所有小熊可以运送的最大重量和。
思路:不小心精度卡死我了。建图没什么好说的,新图的边权就是用路径的权值除以当前二分的值再向下取整。我们跑一发最大流,看是否满流。
AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #include <stack> #define PI acos(-1.0) #define CLR(a, b) memset(a, (b), sizeof(a)) #define fi first #define se second #define ll o<<1 #define rr o<<1|1 using namespace std; typedef long long LL; typedef pair<int, int> pii; const int MAXN = 500 + 10; const int pN = 1e6;// <= 10^7 const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; void add(LL &x, LL y) { x += y; x %= MOD; } pii a[MAXN]; struct Edge { int from, to, cap, flow, next; }; Edge edge[MAXN*3]; int head[MAXN], cur[MAXN], edgenum; void init() {CLR(head, -1); edgenum = 0;} void addEdge(int u, int v, int w) { Edge E1 = {u, v, w, 0, head[u]}; edge[edgenum] = E1; head[u] = edgenum++; Edge E2 = {v, u, 0, 0, head[v]}; edge[edgenum] = E2; head[v] = edgenum++; } int dist[MAXN]; bool vis[MAXN]; bool BFS(int s, int t) { queue<int> Q; CLR(dist, -1); CLR(vis, false); Q.push(s); vis[s] = true; dist[s] = 0; while(!Q.empty()) { int u = Q.front(); Q.pop(); for(int i = head[u]; i != -1; i = edge[i].next) { Edge E = edge[i]; if(!vis[E.to] && E.cap > E.flow) { vis[E.to] = true; dist[E.to] = dist[u] + 1; if(E.to == t) return true; Q.push(E.to); } } } return false; } int DFS(int x, int a, int t) { if(x == t || a == 0) return a; int flow = 0, f; for(int &i = cur[x]; i != -1; i = edge[i].next) { Edge &E = edge[i]; if(dist[E.to] == dist[x] + 1 && (f = DFS(E.to, min(E.cap - E.flow, a), t)) > 0) { E.flow += f; edge[i^1].flow -= f; flow += f; a -= 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; } int n, m, x; int u[MAXN], v[MAXN], w[MAXN]; bool judge(double mid) { init(); for(int i = 0; i < m; i++) { addEdge(u[i], v[i], (int)min(x * 1.0, w[i] * 1.0 / mid)); } //cout << Maxflow(1, n) << endl; return Maxflow(1, n) >= x; } int main() { scanf("%d%d%d", &n, &m, &x); for(int i = 0; i < m; i++) { scanf("%d%d%d", &u[i], &v[i], &w[i]); } double l = 0, r = 1e10, ans = 0; for(int i = 0; i <= 100; i++) { double mid = (l + r) / 2; if(judge(mid)) { ans = mid; l = mid; } else { r = mid; } } //cout << ans << endl; printf("%.10lf\n", ans * x); return 0; }
相关文章推荐
- 刚刚学会个基础链表
- 局部数组
- Java类的加载顺序
- hdu2588 GCD(欧拉函数)
- Android蓝牙2.0 4.0 BLE所有示例apk及源码下载及视频 保证能收发十六进制或字符 有自动连接已经配对的设备
- android(eclipse)广播机制知识梳理(三)
- 《构建之法》第1.2.3章读后感
- 项目笔记
- java语言程序设计第十版(Introduce to java 10th) 课后习题 chapter6-30
- poj1002
- java 自动装箱(面试题)基本知识总结即简例
- linux基础(四)
- 回溯法
- Educational Codeforces Round 9 E.Thief in a Shop
- 使用Apache Phoenix 实现 SQL 操作HBase【包括部分软件安装】
- Codeforces 161D Distance in Tree(树的点分治)
- 结对编码感想
- java类初始化的过程
- 20135320赵瀚青LINUX第五章读书笔记
- 框架学习:hibernate框架的结构和分析