1669 DINIC+二分
题意:
给你一些名单,和每个名单可以放在哪个分组里,现在要求你把所有的人都分到一个他属于的分组(之一),然后问你分组中最多的那个人数最少是多少...
思路:
二分最多的最少,然后用最大流去判断分组是否合理,建图如下
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+二分相关推荐
- POJ2391 Floyd+离散化+二分+DINIC
题意: 有n个猪圈,每个猪圈里面都有一定数量的猪(可能大于当前猪圈的数量),每个猪圈都有自己的容量,猪圈与猪圈之间给出了距离,然后突然下雨了,问多久之后所有的猪都能进圈. 思路: ...
- POJ1325二分匹配或者DINIC(最小路径覆盖)
题意: 有k个任务,两个机器,第一个机器有n个模式,第二个机器有m个模式,每个任务要么在第一个机器的一个模式下工作,要么在第二个机器的一个模式下工作,机器每切换一个模式需要重启一次,两个 ...
- 【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate...
[法一]枚举Time(0~N*M): S->'.'(1); 'D'->T(Time); '.'->'D'(dis(用BFS预处理,注意一旦到达'D',BFS就不能继续扩展了,注意di ...
- 【codevs1422】河城荷取 二分+dinic
题目描述 Description 在幻想乡,河城荷取是擅长高科技工业的河童.荷取的得意之作除了光学迷彩外,还有震动整个幻想乡的巨型人形『非想天则』.不过由于人形太过巨大,所以为它充能是一件很麻烦的事. ...
- POJ--2391--Ombrophobic Bovines【分割点+Floyd+Dinic优化+二分法答案】最大网络流量
联系:http://poj.org/problem?id=2391 题意:有f个草场,每一个草场当前有一定数目的牛在吃草,下雨时它能够让一定数量的牛在这里避雨,f个草场间有m条路连接,每头牛通过一条路 ...
- POJ 2112 Optimal Milking(二分+最大流)
POJ 2112 Optimal Milking 题目链接 题意:给定一些机器和奶牛,在给定距离矩阵,(不在对角线上为0的值代表不可达),每一个机器能容纳m个奶牛.问全部奶牛都能挤上奶,那么走的距离最 ...
- POJ2455 Secret Milking Machine【二分,最大流】
题目大意:N个点P条边,令存在T条从1到N的路径,求路径上的边权的最大值最小为多少 思路:做了好多二分+最大流的题了,思路很好出 二分出最大边权后建图,跑dinic 问题是....这题是卡常数的好题! ...
- poj2112(网络流-最大流+二分)
题意:给你k个挤奶器,c头牛,每个挤奶器能放m头牛,问你奶牛需要走的最大距离最小是多少: 解题思路:因为最大距离最小,也就是求最小的距离满足所有牛都能到,所以我们先用floyd跑最短路,把所有点之间的 ...
- POJ3228二分最大流
题意: 有n个点,每个点有两个权值,金子数量还有仓库容量,金子可以存在自己的仓库里或者是别的仓库里,仓库和仓库之间有距离,问所有金子都必须存到库里最大距离的最小是多少? 思路: ...
最新文章
- 鱼眼图像的unwarping过程
- 关于STM32与SD卡通信的一些思考与总结
- jdk1.8hashmap为什么对hash进行了一次扰动处理
- 驾驶卡丁车 模拟,迷宫(女赛)
- 对象工厂PHP,php – 有一个工厂用于创建对象的好处?
- 关于 时钟抖动 Jitter 和 偏移 Skew
- java 数据流对比_Java IO流之字符流字节流区别
- MySQL 半同步复制+MMM架构
- C#SuperSocket服务器的简易实现
- json_encode 转义
- STM32学习笔记(三 时钟系统 1 时钟系统精讲)
- PostgreSQL安装及关联ArcMap,创建地理空间数据库
- 车型数据导入excel
- python从键盘输入一个数、计算出大于n的最小素数_python 从键盘任意输入一个正整数n,并找出大于n的最小素数,这个程序怎么写...
- Outlook设置规则的一点提示
- 验证苹果电子邮件地址服务器出现问题,iPhone之验证您的电子邮件地址问题解决...
- 金牛座TGAM脑电波传感器模块
- PS缩小图层兼如何使用蒙版
- 9行Python代码实现自动抠图 别再自己抠图啦
- 简明解释算法中的大O符号