题意:
      给你一些名单,和每个名单可以放在哪个分组里,现在要求你把所有的人都分到一个他属于的分组(之一),然后问你分组中最多的那个人数最少是多少...

思路:
     二分最多的最少,然后用最大流去判断分组是否合理,建图如下
         
    s 到 所有人连一条边 流量是1
    所有分组 到 t 连一条边,流量是mid
    然后把所有人和自己属于的分组连边,流量1
    
    跑一边最大流,如果答案等于 N(人数) 那么当前二分满足

    up = mid - 1 ........


#include<stdio.h>
#include<string.h>
#include<queue>#define N_node 1500 + 50
#define N_edge 2000000 + 10000
#define INF 1000000000

using namespace std;typedef struct
{int to ,next ,cost;
}STAR;typedef struct
{int x ,t;
}DEP;typedef struct
{int a ,b;
}EDGE;STAR E[N_edge];
DEP xin ,tou;
EDGE edge[N_edge];
int list[N_node] ,tot;
int list1[N_node];
int deep[N_node];
char str[1000000];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 = 0;E[tot].next = list[b];list[b] = tot;
}int minn(int x ,int y)
{return x < y ? x : y;
}bool BFS_deep(int s ,int t ,int n)
{memset(deep ,255 ,sizeof(deep));xin.x = s;xin.t = 0;deep[s] = 0;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(!E[k].cost || deep[xin.x] != -1)continue;deep[xin.x] = xin.t;q.push(xin);}}for(int i = 0 ;i <= n ;i ++)list1[i] = list[i];return deep[t] != -1;
}int DFS_flow(int s ,int t ,int flow)
{if(s == t) return flow;int nowflow = 0;for(int k = list1[s] ;k ;k = E[k].next){list1[s] = k;int to = E[k].to;int c  = E[k].cost;if(deep[to] != deep[s] + 1 || ! E[k].cost)continue;int tmp = DFS_flow(to ,t ,minn(c ,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 mid ,int tt ,int n ,int m)
{memset(list ,0 ,sizeof(list));tot = 1;int i;for(i = 1 ;i <= n ;i ++)add(0 ,i ,1);for(i = 1 ;i <= m ;i ++)add(n + i ,n + m + 1 ,mid);for(i = 1 ;i <= tt ;i ++)add(edge[i].a ,edge[i].b + n ,1);return DINIC(0 ,n + m + 1 ,n + m + 1) == n;
}int main ()
{int n ,m ,i ,j;while(~scanf("%d %d" ,&n ,&m) && n + m){getchar();int tt = 0;for(i = 1 ;i <= n ;i ++){gets(str);int l = strlen(str) - 1;j = 0;while(str[j] != ' ')j++;int num = 0;for(j++ ;j <= l ;j ++){if(str[j] == ' '){edge[++tt].a = i;edge[tt].b = num + 1;num = 0;continue;}num = num * 10 + str[j] - 48;}edge[++tt].a = i;edge[tt].b = num + 1;}int low ,up ,mid;low = 0 ,up = n;int ans;while(low <= up){mid = (low + up) >> 1;if(ok(mid ,tt ,n ,m)){ans = mid;up = mid - 1;}elselow = mid + 1;}printf("%d\n" ,ans);}return 0;
}



1669 DINIC+二分相关推荐

  1. POJ2391 Floyd+离散化+二分+DINIC

    题意:       有n个猪圈,每个猪圈里面都有一定数量的猪(可能大于当前猪圈的数量),每个猪圈都有自己的容量,猪圈与猪圈之间给出了距离,然后突然下雨了,问多久之后所有的猪都能进圈. 思路:     ...

  2. POJ1325二分匹配或者DINIC(最小路径覆盖)

    题意:        有k个任务,两个机器,第一个机器有n个模式,第二个机器有m个模式,每个任务要么在第一个机器的一个模式下工作,要么在第二个机器的一个模式下工作,机器每切换一个模式需要重启一次,两个 ...

  3. 【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate...

    [法一]枚举Time(0~N*M): S->'.'(1); 'D'->T(Time); '.'->'D'(dis(用BFS预处理,注意一旦到达'D',BFS就不能继续扩展了,注意di ...

  4. 【codevs1422】河城荷取 二分+dinic

    题目描述 Description 在幻想乡,河城荷取是擅长高科技工业的河童.荷取的得意之作除了光学迷彩外,还有震动整个幻想乡的巨型人形『非想天则』.不过由于人形太过巨大,所以为它充能是一件很麻烦的事. ...

  5. POJ--2391--Ombrophobic Bovines【分割点+Floyd+Dinic优化+二分法答案】最大网络流量

    联系:http://poj.org/problem?id=2391 题意:有f个草场,每一个草场当前有一定数目的牛在吃草,下雨时它能够让一定数量的牛在这里避雨,f个草场间有m条路连接,每头牛通过一条路 ...

  6. POJ 2112 Optimal Milking(二分+最大流)

    POJ 2112 Optimal Milking 题目链接 题意:给定一些机器和奶牛,在给定距离矩阵,(不在对角线上为0的值代表不可达),每一个机器能容纳m个奶牛.问全部奶牛都能挤上奶,那么走的距离最 ...

  7. POJ2455 Secret Milking Machine【二分,最大流】

    题目大意:N个点P条边,令存在T条从1到N的路径,求路径上的边权的最大值最小为多少 思路:做了好多二分+最大流的题了,思路很好出 二分出最大边权后建图,跑dinic 问题是....这题是卡常数的好题! ...

  8. poj2112(网络流-最大流+二分)

    题意:给你k个挤奶器,c头牛,每个挤奶器能放m头牛,问你奶牛需要走的最大距离最小是多少: 解题思路:因为最大距离最小,也就是求最小的距离满足所有牛都能到,所以我们先用floyd跑最短路,把所有点之间的 ...

  9. POJ3228二分最大流

    题意:       有n个点,每个点有两个权值,金子数量还有仓库容量,金子可以存在自己的仓库里或者是别的仓库里,仓库和仓库之间有距离,问所有金子都必须存到库里最大距离的最小是多少? 思路:       ...

最新文章

  1. 鱼眼图像的unwarping过程
  2. 关于STM32与SD卡通信的一些思考与总结
  3. jdk1.8hashmap为什么对hash进行了一次扰动处理
  4. 驾驶卡丁车 模拟,迷宫(女赛)
  5. 对象工厂PHP,php – 有一个工厂用于创建对象的好处?
  6. 关于 时钟抖动 Jitter 和 偏移 Skew
  7. java 数据流对比_Java IO流之字符流字节流区别
  8. MySQL 半同步复制+MMM架构
  9. C#SuperSocket服务器的简易实现
  10. json_encode 转义
  11. STM32学习笔记(三 时钟系统 1 时钟系统精讲)
  12. PostgreSQL安装及关联ArcMap,创建地理空间数据库
  13. 车型数据导入excel
  14. python从键盘输入一个数、计算出大于n的最小素数_python 从键盘任意输入一个正整数n,并找出大于n的最小素数,这个程序怎么写...
  15. Outlook设置规则的一点提示
  16. 验证苹果电子邮件地址服务器出现问题,iPhone之验证您的电子邮件地址问题解决...
  17. 金牛座TGAM脑电波传感器模块
  18. PS缩小图层兼如何使用蒙版
  19. 9行Python代码实现自动抠图 别再自己抠图啦
  20. 简明解释算法中的大O符号

热门文章

  1. Softmax 函数的特点和作用是什么?
  2. Free Download Top 100 Hacking Books
  3. (读) 周鸿祎重新思考360(有感)
  4. 30个最常用css选择器解析
  5. [转载] 什么时候应该使用 ==?什么时候应该使用 Equals?
  6. IHttpHandler的学习(0-2)
  7. 【转】Impala导出查询结果到文件
  8. ARM非对齐操作异常解决过程
  9. 【Android Studio快捷键】之导入对应包声明(import packages)
  10. android 实现模拟加载中的程序