poj2112,最大流,最优挤奶方案
按图论列表上来说是基础题。
这道题是省赛之前过的,现在想再拿出来总结一下,感觉这个类型的题很经典。
题意不叙述了,就是有奶牛和机器,每台奶牛分配一个机器,
牛与牛、牛与机器、机器与机器之间都有一距离,求分配后的最大距离的最小值。
一开始没明白啥叫“最大距离的最小值”,就是C头奶牛、K个挤奶器,C头奶牛若想到全部的挤奶器那里去需要一定的距离,
C头奶牛当中某一头奶牛需要走的距离最大那这个距离便为最大值,要使这个最大值最小。(DT的题意)
这样子二分就好了,(又是二分,泥垢了),若根据mid建图后的最大流>=C,那这个便是成功的。
有一堆点位于X,一堆点位于Y,若试着建立从X到Y的某种关系,(比如距离、权值),加入超级源点与汇点S、T并建立相应权的边后
肯定能够使得X的点和Y的点分别属于集合S、T(这也是最小割的思想)。
ps:二分输出的技巧如我的代码 if(ans>=mid) R = mid; cout<<R<<endl; 这样输出的R便是正确的了。
废话了比较多,仅是自己身为一个弱渣的小提醒。附个代码。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;const int INF = 0x3c3c3c3c;const int maxn = 500 + 10; //结点最多数目
struct Edge{ //代表一条from->to容量为cap,流量为flow的弧int from, to, cap, flow;
};struct Dinic{int n, m, s, t; //结点数,边数(包括反向弧), 源点、汇点号vector<Edge> edges; //边表 edge[e]与edge[e^1]互为反向弧vector<int> G[maxn];bool vis[maxn];int d[maxn];int cur[maxn];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 m = edges.size();G[from].push_back(m-2);G[to].push_back(m-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;}
};
int dis[500][500];
int main()
{//freopen("in.txt", "r", stdin);int K, C, M;while(scanf("%d %d %d", &K, &C, &M) == 3){int i, j, k, l, a;int sum = K + C;for(i = 1;i <= sum;i++){for(j = 1;j <= sum;j++){scanf("%d", &a);if(i==j) { dis[i][j] = 0; continue; }if(a == 0) dis[i][j] = INF;else dis[i][j] = a;}}for(k = 1;k <= sum;k++){for(i = 1;i <= sum;i++){for(j = 1;j <= sum;j++){if(dis[i][j] > dis[i][k]+dis[k][j])dis[i][j] = dis[i][k] + dis[k][j];}}}int L = 1, R = 40000;while(L < R){int mid =(L+R)/2;Dinic test;for(i = 1;i <= K;i++){for(j = K+1;j <= sum;j++){if(dis[i][j]<=mid) test.AddEdge(i,j,1);}}for(i = 1;i <= K;i++) test.AddEdge(0,i,M);for(i = K+1;i <= sum;i++) test.AddEdge(i,sum+1,1);int ans = test.Maxflow(0, sum+1);if(ans>=C) { // why bi_search? it's upR = mid;}else L = mid+1;}printf("%d\n", R);}return 0;
}
poj2112,最大流,最优挤奶方案相关推荐
- 木板切割最优matlab,矩形木板最优切割方案的设计与实现
邹涵 李涛 朱婷婷 摘要:本文所设计的最优切割方案使用了回溯法和递归算法对最优切割问题进行划分,使木板最优切割问题转化为不同切割方式下木板的最大利用率问题,同时根据切割要求对切割方案进行优化,选择最优 ...
- 计算促销最优组合方案
--1.建表 CREATE TABLE #A ( id INT IDENTITY(1,1), model VARCHAR(10), price DECIMAL(18,2) ) --2.插入数据 INS ...
- 恒流、限流功能驱动 WLED 方案
产品简介 AP5414 是一种输入电压范围宽(0.8~5.5V),可调恒定电流和限定电流两种模式来 驱动白光 LED 而设计的升压型 DC/DC 变换器.该器件能利用单节或双节干电池驱动单 颗大功率白 ...
- 改进多目标粒子群储能选址定容matlab 采用matlab编程得到33节点系统改进多目标储能选址定容方案,采用基于信息熵的序数偏好法(TOPSIS)求解储能的最优接入方案
改进多目标粒子群储能选址定容matlab 采用matlab编程得到33节点系统改进多目标储能选址定容方案,采用基于信息熵的序数偏好法(TOPSIS)求解储能的最优接入方案,程序运行稳定,注释清楚. 现 ...
- 《Java后端性能调优实战方案手册》,看完至少阿里P7
之前有朋友说,"我们公司的系统从来都没有经过性能调优,集成测试没问题后就上线了,上线后也几乎没出现过性能问题."其实没遇到性能问题不代表程序不存在性能问题,只能说明系统的访问量有点 ...
- (Dijkstra算法)设计实现一个全国大城市间的交通咨询程序,为旅客提供三种最优决策方案:(1)飞行时间最短(2)费用最小(3)中转次数最少。
设计实现一个全国大城市间的交通咨询程序,为旅客提供三种最优决策方案: (1)飞行时间最短 (2)费用最小 (3)中转次数最少 数据如下: 机 号 出 发 地 到 达 地 出发时间 到达时间 费 用 ...
- 模流分析的11个作用:让产品在设计过程中得到最优的方案
1.胶口位置的合理性: 2.进胶口的大小以及流道的大小: 3.冷却水路的设计是否合理性: 4.了解产品的成型周期的合理性: 5.锁模力的大小,提前确认注塑机的大小: 6.确认产品困气区域,提前做好排气 ...
- 网易实时数仓 | 流式ETL实践方案
点击上方 "肉眼品世界"关注, 深度价值体系传递 摘要:网易游戏资深开发工程师林小铂为大家带来网易游戏基于 Flink 的流式 ETL 建设的介绍.内容包括: 业务背景 专用 E ...
- 读书笔记之:《心流 最优体验心理学》 米哈里·契克森米哈赖 第一章、第二章
文章目录 心流是当一个人完全沉浸在某种活动中,无视其他事物存在的状态,这种体验本身会获得莫大的喜悦,使人愿意付出巨大的代价. 心流是一种最优体验,这种最优体验产生于一种自我掌控的感觉,虽然我们未必会在 ...
- 读书档案-心流:最优体验心理学
书名:<心流:最优体验心理学> 类别:积极心理学 作者:米哈里.契克森米哈赖 时间:2021年03月01日 1.阅读这本书的目标(为什么选择?为什么要购买?) 这是我读的第一本心理学书籍. ...
最新文章
- linux与window中sleep函数的头文件
- maven与eclipse连接的配置
- Android Studio修改debug.keystore
- POJ 3258 River Hopscotch(二分查找答案)
- java.util.HashMap
- PreparedStatement的用法
- UNI-APP获取手机MAC地址
- 237Echarts - 3D 柱状图(Image to Bar3D)
- Deep Closest Point学习笔记(才开始接触点云)
- OSChina 周六乱弹 —— 周末万岁!
- java 农历_java怎么取得农历的节日
- Python 编程摘要
- 基于MATLAB的农业病虫害识别系统
- 全面掌控!打造智慧城市建设的“领导驾驶舱”
- 新时期,老师该怎么撑伞?
- Python Qt UI设计
- OPPO Find X5即将发布,自曝双旗舰布局,自研芯片AI算力超苹果
- 中国大学mooc计算机应用基础答案,2020-计算机应用基础(Windows7+Office2016)-中国大学mooc...
- 使用Fiddler抓包解决“请在微信客户端打开链接”的问题
- idea 链接database使用Scripted Extensions自动生成代码