题意:

      给你N个位置,每个位置都有金矿数量和仓库数量,然后位置和位置之间的距离给了出来,最后问你吧所有的金矿都放到库里面走的路径 最长的最短 是多少?

思路:

     比较简单的一个题,直接二分答案,然后用最大流是否满流来判断二分方向,还有就是建图的时候不用拆点什么的,一开始建图想麻烦了,都快敲完了才反应过来,具体看代码。

#include<stdio.h>

#include<string.h>

#include<queue>

#define N_node 200  + 10

#define N_edge 90000

#define INF 1000000000

using namespace std;

typedef struct

{

   int to ,cost ,next;

}STAR;

typedef struct

{

   int x ,t;

}DEP;

typedef struct

{

   int a ,b ,c;

}EDGE;

EDGE edge[22000];

STAR E[N_edge];

DEP xin ,tou;

int list[N_node] ,list2[N_node] ,tot;

int deep[N_node];

int aaa[220] ,bbb[220];

void add(int a ,int b ,int c)

{

     E[++tot].to = b;

     E[tot].cost = c;

     E[tot].next = list[a];

     list[a] = tot;

    

     E[++tot].to = a;

     E[tot].cost = c;

     E[tot].next = list[b];

     list[b] = tot;

}

bool BFS_Deep(int s ,int t ,int n)

{

   memset(deep ,255 ,sizeof(deep));

   xin.x = s ,xin.t = 0;

   deep[xin.x] = xin.t;

   queue<DEP>q;

   q.push(xin);

   while(!q.empty())

   {

      tou = q.front();

      q.pop();

      for(int k = list[tou.x] ;k ;k = E[k].next)

      {

          xin.x = E[k].to;

          xin.t = tou.t + 1;

          if(deep[xin.x] != -1 || !E[k].cost)

          continue;

          deep[xin.x] = xin.t;

          q.push(xin);

      }

   }

   for(int i = 0 ;i <= n ;i ++)

   list2[i] = list[i];

   return deep[t] != -1;

}

int minn(int x ,int y)

{

   return x < y ? x : y;

}

int DFS_Flow(int s ,int t ,int flow)

{

   if(s == t) return flow;

   int nowflow = 0;

   for(int k = list2[s] ;k ;k = E[k].next)

   {

       list2[s] = k;

       int to = E[k].to;

       if(deep[to] != deep[s] + 1 || !E[k].cost)

       continue;

       int tmp = DFS_Flow(to ,t ,minn(E[k].cost ,flow - nowflow));

       nowflow += tmp;

       E[k].cost -= tmp;

       E[k^1].cost += tmp;

       if(nowflow == flow) break;

   }

   if(!nowflow) deep[s] = 0;

   return nowflow;

}

int DINIC(int s ,int t ,int n)

{

   int Ans = 0;

   while(BFS_Deep(s ,t ,n))

   {

       Ans += DFS_Flow(s ,t ,INF);

   }

   return Ans;

}

bool ok(int n ,int m ,int sum ,int mid)

{

     memset(list ,0 ,sizeof(list)) ,tot = 1;

     for(int i = 1 ;i <= n ;i ++)

     {

        add(0 ,i ,aaa[i]);

        add(i ,n + 1 ,bbb[i]);

     }

     for(int i = 1 ;i <= m ;i ++)

     if(edge[i].c <= mid)

     {

        add(edge[i].a ,edge[i].b ,INF);

     }

     int flow = DINIC(0 ,n + 1 ,n + 1);

     return  flow == sum;

}

    

int main ()

{

    int n ,m ,i ,sum;

    while(~scanf("%d" ,&n) && n)

    {

        for(sum = 0 ,i = 1 ;i <= n ;i ++)

        {

           scanf("%d" ,&aaa[i]);

           sum += aaa[i];

        }

        for(i = 1 ;i <= n ;i ++)

        scanf("%d" ,&bbb[i]);

        scanf("%d" ,&m);

        for(i = 1 ;i <= m ;i ++)

        scanf("%d %d %d" ,&edge[i].a ,&edge[i].b ,&edge[i].c);

        int low ,up ,mid ,Ans = -1;

        low = 0 ,up = 11000;

        while(low <= up)

        {

           mid = (low + up) >> 1;

           if(ok(n ,m ,sum ,mid))

           {

               Ans = mid;

               up = mid - 1;

           }

           else low = mid + 1;

        }

        Ans == -1 ? puts("No Solution"):printf("%d\n" ,Ans);

    }

    return 0;

}

       

POJ 3228 二分最大流的更多相关文章

  1. poj 3228(二分+最大流)

    题目链接:http://poj.org/problem?id=3228 思路:增设一个超级源点和一个超级汇点,源点与每一个gold相连,容量为gold数量,汇点与仓库相连,容量为仓库的容量,然后就是二 ...

  2. poj 2455 二分+最大流

    这个因为点少用邻接矩阵做的. 题意:求由1到n的t条不重复路径中最大边权值的最小值. 思路:先对边权进行排序,然后二分边权值,建图求从1到n的最大流,当最大流为t时便求出答案. 代码: #includ ...

  3. POJ 2112 二分+最大流

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 17297   Accepted: 6203 ...

  4. POJ 2391 二分+最大流

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19066   Accepted: 4 ...

  5. poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点

    题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...

  6. uvalive 3231 Fair Share 公平分配问题 二分+最大流 右边最多流量的结点流量尽量少。

    /** 题目: uvalive 3231 Fair Share 公平分配问题 链接:https://vjudge.net/problem/UVALive-3231 题意:有m个任务,n个处理器,每个任 ...

  7. POJ - 2018 二分+单调子段和

    依然是学习分析方法的一道题 求一个长度为n的序列中的一个平均值最大且长度不小于L的子段,输出最大平均值 最值问题可二分,从而转变为判定性问题:是否存在长度大于等于L且平均值大于等于mid的字段和 每个 ...

  8. HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流

    题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    ...

  9. HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流

    二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示 ...

随机推荐

  1. 关于 C++ 中的强制转换 - 基础篇

    引言 假设有基类 A,包含了虚函数 func1,以及有派生类 B,继承于类 A,派生类 B 中实现了函数 func1.此时可以用 A 类型的指针指向 B 类型的对象,并用 A 类型的指针调用 B 类型 ...

  2. 因MemoryCache闹了个笑话

    前言 是这么一回事: 我正在苦思一个业务逻辑,捋着我还剩不多的秀发,一时陷入冥想中...... 突然聊天图标一顿猛闪,打开一看,有同事语音: 大概意思是:同事把项目中Redis部分缓存换成Memory ...

  3. AI在出行场景的应用实践:路线规划、ETA、动态事件挖掘…

    ​前言:又到春招季!作为国民级出行服务平台,高德业务快速发展,大量校招/社招名额开放,欢迎大家投递简历,详情见文末.为帮助大家更了解高德技术,我们策划了#春招专栏#的系列文章,组织各业务团队的高年级同 ...

  4. C#的foreach遍历循环和隐式类型变量

    C#的foreach遍历循环和隐式类型变量 foreach遍历循环 foreach (<baseType> <name> in <array>>) { //c ...

  5. Java高并发编程基础三大利器之CountDownLatch

    引言 上一篇文章我们介绍了AQS的信号量Semaphore<Java高并发编程基础三大利器之Semaphore>,接下来应该轮到CountDownLatch了. 什么是CountDownL ...

  6. gstreamer应用开发(播放器)之旅

    GStreamer开发,主要分为两块:应用开发.插件开发. 插件开发人员,通常是编解码库的作者(做出了编解码库后,希望gstreamer能用起来这个库,因此增加这个适配层).芯片原厂人员(将自家的hw ...

  7. MongoDB数据库的使用

    MongoDB是一个基于分布式 文件存储的NoSQL数据库,适合存储JSON风格文件的形式. 三元素:数据库.集合和文档. 文档:对应着关系数据库中的行,就是一个对象,由键值对构成,是json的扩展B ...

  8. java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。

    1 /*37 [程序 37 报数] 2 题目:有 n 个人围成一圈,顺序排号.从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位. 4 */ 5 ...

  9. OMnet++ 初学者教程 第一节 入门

    第1部分-入门 1.1模型 首先,让我们从一个包含两个节点的"network"开始.节点将做一些简单的事情:一个是节点将创建一个数据包,而两个节点将继续来回传递相同的数据包.我们将 ...

  10. 前端vue性能优化

    一:代码层次优化 1.1.v-if 和 v-show 区分使用场景 v-if 是 真正 的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建:也是惰性的:如果在初始渲染时 ...