题目

百度

分析

很容易想到二分答案

然后考虑判定

条件很多,奇奇怪怪

那就上网络流吧

边权 \(\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的更多相关文章

  1. POJ 3228 Gold Transportation

    Gold Transportation Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on PKU. Ori ...

  2. POJ 3228 Gold Transportation(带权并查集,好题)

    参考链接:http://www.cnblogs.com/jiaohuang/archive/2010/11/13/1876418.html 题意:地图上某些点有金子,有些点有房子,还有一些带权路径,问 ...

  3. poj 3228 Gold Transportation 二分+网络流

    题目链接 给出n个城市, 每个城市有一个仓库, 仓库有容量限制, 同时每个城市也有一些货物, 货物必须放到仓库中. 城市之间有路相连, 每条路有长度. 因为有些城市的货物量大于仓库的容量, 所以要运到 ...

  4. POJ:3228-Gold Transportation(要求最小生成树最大边最小)

    Gold Transportation Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3079 Accepted: 1101 D ...

  5. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  6. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  7. 图论常用算法之一 POJ图论题集【转载】

    POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...

  8. hdu图论题目分类

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  9. HDU图论题单

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  10. POJ 1797 Heavy Transportation(最大生成树/最短路变形)

    传送门 Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 31882   Accept ...

随机推荐

  1. 解决linux vlc设置中文问题

    解决方法 sudo apt install vlc-l10n

  2. 关于在linux上vm virtualbox读取不到U盘问题的解决

    1.设置usb2.0模式 如果你没安装拓展插件的话,调成usb2.0就会出现无效的配置这个提示,并且启动虚拟机会报 Implementation of the USB 2.0 controller n ...

  3. Iris_data_analysis

    SVM调用实例--鸢尾花 任务描述: 构建一个模型,根据鸢尾花的花萼和花瓣大小将其分为三种不同的品种. 数据集: 每一行数据由4个特征值及1个目标值组成,4个特征值分别为:萼片长度.萼片宽度.花瓣长度 ...

  4. C++编程笔记(GPU并行编程)

    目录 一.配置并使用 二.代码 三.内存管理 数组的分配 一.配置并使用 环境:Windows10 + CLion + VS2019 cuda的安装,并行的话只需要安装cuda,cuDNN就不必了 编 ...

  5. 【Shell脚本案例】案例6:查看网卡实时流量

    一.背景 监控,对服务器查看实时流量 了解服务器的数据传输量 二.说明 1.获取网络流量 ifconfig查看网卡就能看到数据包传输情况 2.可以使用工具查看 iftop cat /proc/net/ ...

  6. 彻底理解Python中的闭包和装饰器(下)

    上篇讲了Python中的闭包,本篇要讲的装饰器就是闭包的一个重要应用. 如果你还不知道什么是闭包,猛戳这里阅读:彻底理解Python中的闭包和装饰器(上) 什么是装饰器 装饰器的作用是在不修改函数定义 ...

  7. 1.5.6 NN与2NN-hadoop-最全最完整的保姆级的java大数据学习资料

    目录 1.5.6 NN与2NN 1.5.6.1 HDFS元数据管理机制 1.5.6.2 Fsimage与Edits文件解析 1.5.6.2.1 Fsimage文件内容 1.5.6.2.2 Edits文 ...

  8. MySQL可视化软件(Navicat)部署与使用

    目录 一:可视化软件(Navicat) 1.什么是可视化软件? 2.什么是Navicat? 二:部署MySQL(Navicat) 1.Navicat连接本地MySQL 2.连接MySQL,输入密码,在 ...

  9. python语法之注释

    引言 注释的最大作用是提高程序的可读性,在开发过程中非常有必要加上注释.Python 支持两种类型的注释,分别是单行注释和多行注释. 1 单行注释 Python 使用井号#作为单行注释的符号,语法格式 ...

  10. wsl2 kali修改语言

    直接执行sudo dpkg-reconfigure locales 会提示 dpkg-query: package 'locales' is not installed and no informat ...