题目

百度

分析

很容易想到二分答案

然后考虑判定

条件很多,奇奇怪怪

那就上网络流吧

边权 \(\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. 二分查找-LeetCode704 简单题

    LeetCode代码链接:https://leetcode.cn/problems/binary-search/ 题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ...

  2. docker 第一课

    centos安装docker yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ...

  3. 【Spring专题】「开发指南」夯实实战基础功底之解读logback-spring.xml文件的详解实现

    logback的maven配置 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j- ...

  4. elementui中 分页在vue中的使用

     template中: <el-pagination background layout="prev, pager, next" :total="total&quo ...

  5. python3使用OCR识别图片

    放假三天,闲来无事,想学下python爬虫.本想跟着网上教程操作一遍,奈何安装使用过程中出现一堆问题,并且在网上搜了一堆复制黏贴的答案,关键都不能起作用,最后终于找到一篇生效,为了以后不至于再经历这种 ...

  6. 学习ASP.NET Core Blazor编程系列十九——文件上传(下)

    学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...

  7. 时钟同步服务器ntp安装文档

    应用场景 同步时钟很有必要,如果服务器的时间差过大会出现不必要的问题 大数据产生与处理系统是各种计算设备集群的,计算设备将统一.同步的标准时间用于记录各种事件发生时序, 如E-MAIL信息.文件创建和 ...

  8. 每个Java程序员都必须知道的四种负载均衡算法

    前言 一般来说,我们在设计系统的时候,为了系统的高扩展性,会尽可能的创建无状态的系统,这样我们就可以采用集群的方式部署,最终很方便的根据需要动态增减服务器数量.但是,要使系统具有更好的可扩展性,除了无 ...

  9. 超级容易理解的Three.js中的物体rotation

    假设模特头朝着自己现在躺在地上 那么改变Y就是等于躺着转圈圈 mesh.rotation.set( 0,Math.PI/1.2,0); 改变X就意味着,这个是本来模特头朝着自己躺着,然后站起来了,后脑 ...

  10. 分布式协议与算法-Raft算法

    本文总结自:极客时间韩健老师的分布式协议与算法实战课程. 大家都知道,Raft算法属于Multi-Paxos算法,它是在Multi-Paxos思想的基础上,做了一些简化和限制.关于Paxos算法,博主 ...