Gold Transportation
题目
百度
分析
很容易想到二分答案
然后考虑判定
条件很多,奇奇怪怪
那就上网络流吧
边权 \(\leq mid\) 两个城市连边 \(inf\)
源点与所有城市连边,边权为本城市有金矿量
城市与自己的仓库连边,边权为本城市仓库容量
仓库与汇点两边 \(inf\)
\(Code\)
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
const int N = 205 , M = 40005 , INF = 2e9;
int w[N] , c[N] , tot , n , m , W , S = 0 , T = 2 * N - 9;
int h[2 * N] , cur[2 * N] , dep[2 * N];
struct node{int x , y , z;}b[M];
struct edge{int to , nxt , w;}e[2 * M];
inline void add(int x , int y , int z){e[++tot] = edge{y , h[x] , z} , h[x] = tot;}
void build(int up)
{
memset(h , 0 , sizeof h);
tot = 1;
for(register int i = 1; i <= m; i++)
if (b[i].z <= up) add(b[i].x , b[i].y , INF) , add(b[i].x , b[i].y , 0),
add(b[i].y , b[i].x , INF) , add(b[i].y , b[i].x , 0);
for(register int i = 1; i <= n; i++) add(i , i + n , c[i]) , add(i + n , i , 0);
for(register int i = 1; i <= n; i++) add(S , i , w[i]) , add(i , S , 0);
for(register int i = 1; i <= n; i++) add(i + n , T , INF) , add(T , i + n , 0);
}
queue<int> q;
int bfs()
{
while (!q.empty()) q.pop();
for(register int i = S; i <= T; i++) cur[i] = h[i] , dep[i] = 0;
dep[S] = 1 , q.push(S);
while (!q.empty())
{
int now = q.front(); q.pop();
for(register int i = h[now]; i; i = e[i].nxt)
{
int v = e[i].to;
if (dep[v] || e[i].w == 0) continue;
dep[v] = dep[now] + 1 , q.push(v);
}
}
return dep[T];
}
int dfs(int x , int fa , int mi)
{
if (x == T || mi <= 0) return mi;
int flow = 0;
for(register int i = cur[x]; i; i = e[i].nxt)
{
cur[x] = i;
int v = e[i].to;
if (e[i].w == 0 || v == fa || dep[x] + 1 != dep[v]) continue;
int f = dfs(v , x , min(mi , e[i].w));
if (f <= 0) continue;
flow += f , mi -= f , e[i].w -= f , e[i ^ 1].w += f;
if (mi <= 0) break;
}
return flow;
}
int dinic()
{
int flow = 0;
while (bfs()) flow += dfs(S , -1 , INF);
return flow;
}
int check(int up)
{
build(up);
if (dinic() >= W) return 1;
return 0;
}
int main()
{
scanf("%d" , &n);
while (n != 0)
{
W = 0;
for(register int i = 1; i <= n; i++) scanf("%d" , &w[i]) , W += w[i];
for(register int i = 1; i <= n; i++) scanf("%d" , &c[i]);
scanf("%d" , &m);
int l = INF , r = -INF , mid , ans = INF;
for(register int i = 1; i <= m; i++)
scanf("%d%d%d" , &b[i].x , &b[i].y , &b[i].z),
l = min(l , b[i].z) , r = max(r , b[i].z);
while (l <= r)
{
mid = (l + r) >> 1;
if (check(mid)) r = mid - 1 , ans = mid;
else l = mid + 1;
}
if (ans == INF) printf("No Solution\n");
else printf("%d\n" , ans);
scanf("%d" , &n);
}
}
Gold Transportation的更多相关文章
- POJ 3228 Gold Transportation
Gold Transportation Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on PKU. Ori ...
- POJ 3228 Gold Transportation(带权并查集,好题)
参考链接:http://www.cnblogs.com/jiaohuang/archive/2010/11/13/1876418.html 题意:地图上某些点有金子,有些点有房子,还有一些带权路径,问 ...
- poj 3228 Gold Transportation 二分+网络流
题目链接 给出n个城市, 每个城市有一个仓库, 仓库有容量限制, 同时每个城市也有一些货物, 货物必须放到仓库中. 城市之间有路相连, 每条路有长度. 因为有些城市的货物量大于仓库的容量, 所以要运到 ...
- POJ:3228-Gold Transportation(要求最小生成树最大边最小)
Gold Transportation Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3079 Accepted: 1101 D ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- hdu图论题目分类
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- HDU图论题单
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- POJ 1797 Heavy Transportation(最大生成树/最短路变形)
传送门 Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 31882 Accept ...
随机推荐
- Windows 服务器中使用 mysqldump 命令导出数据,解决中文乱码问题
起因 环境:阿里云服务器(windows server).mysql(8.0.11) mysql> select @@version; +-----------+ | @@version | + ...
- 【Java进阶】五分钟快速掌握JVM优化概念、常用命令、工具、JUC、多线程、GC等知识
〇.概述 (一)资料 史上最全最详细的JVM优化方案:http://www.360doc.com/content/22/0513/10/34195792_1031121509.shtml (二)内容概 ...
- MyBatis03:连接池及事务控制、xml动态SQL语句、多表操作
今日内容: mybatis中的连接池.事务控制[原理了解,应用会用] mybatis中连接池的使用及分析 mybatis中事务控制的分析 mybatis中基于xml配置的动态SQL语句使用[会用即可] ...
- k8s-学习笔记总结(从入门到放弃的学习路线)
刚入门学习k8s,我觉得挺难的,一头雾水,买了一本<Kubernetes权威指南>,真的很厚.我觉得作为应用开发人员的学习路线,不要想着一口气看完k8s的所有概念,要逐步学习,要看完这么厚 ...
- Py2neo:一种快速导入百万数据到Neo4j的方式
Py2neo:一种快速导入百万数据到Neo4j的方式 Py2neo是一个可以和Neo4j图数据库进行交互的python包.虽然py2neo操作简单方便,但是当节点和关系达几十上百万时,直接创建和导入节 ...
- go-carbon 1.5.1 版本发布, 修复已知 bug 和新增土耳其翻译文件
carbon 是一个轻量级.语义化.对开发者友好的golang时间处理库,支持链式调用. 目前已被 awesome-go 收录,如果您觉得不错,请给个star吧 github.com/golang-m ...
- 动手实验查看MySQL索引的B+树的高度
一:文中几个概念 h:统称索引的高度: h1:主键索引的高度: h2:辅助索引的高度: k:非叶子节点扇区个数. 二:索引结构 叶子节点其实是双向链表,而叶子节点内的行数据是单向链表,该图未体现. 磁 ...
- [OpenCV实战]26 基于OpenCV实现选择性搜索算法
目录 1 背景 1.1 目标检测与目标识别 1.2 滑动窗口算法 1.3 候选区域选择算法 2 选择性搜索算法 2.1 什么是选择性搜索? 2.2 选择性搜索相似性度量 2.3 结果 3 代码 4 参 ...
- Spark下中文分词常用项目
Spark下中文分词常用项目 四种中文分词工具名称: hanLP ansj jieba fudannlp 推荐使用ansj,HanLP效果也不错 Ansj中文分词 基于n-Gram+CRF+HMM的中 ...
- ArcGIS工具 - 统计工具数量
ESRI作为GIS行业中的龙头,代表产品ArcGIS也在不断地优化和升级,从10.0开始已发布了8个版本,其工具箱(ToolBox)是它一个特色,每个版本的工具箱数量是不相同的,为源地理来教您如何统计 ...