题意:

      给你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. pytorch(00)

    pytorch入门到项目(-) 一.pytorch的环境 本身项目采用win10系统+pycharm+anaconda+cuda. 其中版本为 python 3.7 anaconda 5.3.1 cu ...

  2. CVE-2017-7504-JBoss JMXInvokerServlet 反序列化

    漏洞分析 https://paper.seebug.org/312/ 漏洞原理 这是经典的JBoss反序列化漏洞,JBoss在/invoker/JMXInvokerServlet请求中读取了用户传入的 ...

  3. Java数据持久层

    一.前言 1.持久层 Java数据持久层,其本身是为了实现与数据源进行数据交互的存在,其目的是通过分层架构风格,进行应用&数据的解耦. 我从整体角度,依次阐述JDBC.Mybatis.Myba ...

  4. myeclipse js报错

    Myeclipse 版本10.1 加载的js报错,解决方法: window -> preferences -> myeclipse -> validation,在右边下拉框找到 Ja ...

  5. springboot系列四:springboot整合mybatis jsp

    一.用IDEA 创建maven项目 项目目录结构 1.添加pom jar依赖 <?xml version="1.0" encoding="UTF-8"?& ...

  6. python常见错误和异常

    1.BaseExeception 所有异常的基类 2.SystemEixt 解释器请求退出 3.KeyboardInterrupt 用户中断执行 4.Exception 常规错误的基类 5.StopI ...

  7. 在Python中创建M x N的数组

    在Python中创建M x N的数组 一般有三种方法: 列表乘法 dp = [[0] * n] * m for 循环 dp= [[0 for _ in range(n)] for _ in range ...

  8. DevExpress主要常用控件

    DevExpress主要常用控件说明:1. TestEdit: 一个单行文本编辑器. 常用属性:Name:该控件的名称.Text:该控件中的内容.Enabled:该控件是否激活. Visible:控件 ...

  9. JAVA面试核心知识点(一):计算机网络

    一·计算机网络 1.1 网络基础知识 OSI 七层协议(制定标准使用的标准概念框架): 物理层(传递比特流0101)->数据链路层(将比特流转换为逻辑传输线路)->网络层(逻辑编址,分组传 ...

  10. Hibernate的Dao层通用设计

    hibernate作为一款优秀的数据库持久化框架,在现实的运用中是非常广泛的.它的出现让不熟悉sql语法的程序员能开发数据库连接层成为一种可能,但是理想与现实永远是有差距的.开发过程中如果只使用hql ...