题意:

      给你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. linux时间问题

    如果遇到创建时间和更新时间,不一致,先将时间调整为一致. 导致不一致的原因可能是时区不对,使用 tzselect ,将时区调整为Asia/Shanghai , cp /usr/share/zonein ...

  2. 解决VM 与 Device/Credential Guard 不兼容(全网有效解决思路)

    为什么要写这篇文章先说背景:前段时间因为学习Linux系统需要,自己本机用的是Windows系统,那这里就需要用到虚拟机来创建虚拟环境用来支持Linux系统 1: 于是乎,自己很激动的下载了vm虚拟机 ...

  3. WPF 应用 - 使用 Properties.Settings 保存客户端密码

    1. 先在项目的 Settings.settings 新建需要的字段和类型 有需要还可设置初始默认值 2. 启动客户端时,获取 Properties.Settings 的属性值 public void ...

  4. 前端坑多:使用js模拟按键输入的踩坑记录

    坑 一开始在Google搜索了一番,找到了用jQuery的方案,代码量很少,看起来很美好很不错,结果,根本没用-- 我反复试了这几个版本: var e = $.Event('keyup') e.key ...

  5. Java BasicNameValuePair怎么传数组类型的参数?

    BasicNameValuePair 传数组的话可以这样传 map.put("ids[]", 1); map.put("ids[]", 2);

  6. android分析之消息处理

    前序:每个APP对应一个进程,该进程内有一个ActivityThread的线程,称为主线程(即UI主线程),此外,还有其他线程,这个再论. android的消息系统分析. 每个Thread只对应一个L ...

  7. P1423_小玉在游泳(JAVA语言)

    题目描述 小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦. 已知小玉第一步能游2米,可是随着越来越累,力气越来越小, 她接下来的每一步都只能游出上一步距离的98%. 现在小玉想知道 ...

  8. 1、Spring教程之Spring概述

    1.Spring概述 简介 Spring : 春天 --->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架. 2004年3月24 ...

  9. FutureTask核心源码分析

    本文主要介绍FutureTask中的核心方法,如果有错误,欢迎大家指出! 首先我们看一下在java中FutureTask的组织关系 我们看一下FutureTask中关键的成员变量以及其构造方法 //表 ...

  10. 【工程应用一】 多目标多角度的快速模板匹配算法(基于NCC,效果无限接近Halcon中........)

    愿意写代码的人一般都不太愿意去写文章,因为代码方面的艺术和文字中的美学往往很难兼得,两者都兼得的人通常都已经被西方极乐世界所收罗,我也是只喜欢写代码,让那些字母组成美妙的歌曲,然后自我沉浸在其中自得其 ...