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 ...
随机推荐
- 二分查找-LeetCode704 简单题
LeetCode代码链接:https://leetcode.cn/problems/binary-search/ 题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ...
- docker 第一课
centos安装docker yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ...
- 【Spring专题】「开发指南」夯实实战基础功底之解读logback-spring.xml文件的详解实现
logback的maven配置 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j- ...
- elementui中 分页在vue中的使用
template中: <el-pagination background layout="prev, pager, next" :total="total&quo ...
- python3使用OCR识别图片
放假三天,闲来无事,想学下python爬虫.本想跟着网上教程操作一遍,奈何安装使用过程中出现一堆问题,并且在网上搜了一堆复制黏贴的答案,关键都不能起作用,最后终于找到一篇生效,为了以后不至于再经历这种 ...
- 学习ASP.NET Core Blazor编程系列十九——文件上传(下)
学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...
- 时钟同步服务器ntp安装文档
应用场景 同步时钟很有必要,如果服务器的时间差过大会出现不必要的问题 大数据产生与处理系统是各种计算设备集群的,计算设备将统一.同步的标准时间用于记录各种事件发生时序, 如E-MAIL信息.文件创建和 ...
- 每个Java程序员都必须知道的四种负载均衡算法
前言 一般来说,我们在设计系统的时候,为了系统的高扩展性,会尽可能的创建无状态的系统,这样我们就可以采用集群的方式部署,最终很方便的根据需要动态增减服务器数量.但是,要使系统具有更好的可扩展性,除了无 ...
- 超级容易理解的Three.js中的物体rotation
假设模特头朝着自己现在躺在地上 那么改变Y就是等于躺着转圈圈 mesh.rotation.set( 0,Math.PI/1.2,0); 改变X就意味着,这个是本来模特头朝着自己躺着,然后站起来了,后脑 ...
- 分布式协议与算法-Raft算法
本文总结自:极客时间韩健老师的分布式协议与算法实战课程. 大家都知道,Raft算法属于Multi-Paxos算法,它是在Multi-Paxos思想的基础上,做了一些简化和限制.关于Paxos算法,博主 ...