https://vjudge.net/problem/UVALive-3268

题意:

有n个人和m个组。一个人可能属于很多组。现在请你从某些组中去掉几个人,使得每个人只属于一个组,并使得人数最多的组中人员数目为最小值。

思路:
建立超级源汇点,源点和每个人相连,容量为1,说明每个人最多只能在一个组中。每个人和可以属于的组相连,容量为1。接下来枚举组的最大容量值,将每组和汇点相连,容量为枚举值,二分跑最大流即可。

  1 #include<iostream>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<cstdio>
  5 #include<sstream>
  6 #include<vector>
  7 #include<stack>
  8 #include<queue>
  9 #include<cmath>
 10 #include<map>
 11 #include<set>
 12 using namespace std;
 13 typedef long long ll;
 14 typedef pair<int,int> pll;
 15 const int INF = 0x3f3f3f3f;
 16 const int maxn = 2000 + 5;
 17
 18 vector<int> g[maxn];
 19
 20 struct Edge
 21 {
 22     int from,to,cap,flow;
 23     Edge(int u,int v,int w,int f):from(u),to(v),cap(w),flow(f){}
 24 };
 25
 26 struct Dinic
 27 {
 28     int n,m,s,t;
 29     vector<Edge> edges;
 30     vector<int> G[maxn];
 31     bool vis[maxn];
 32     int cur[maxn];
 33     int d[maxn];
 34
 35     void init(int n)
 36     {
 37         this->n=n;
 38         for(int i=0;i<n;++i) G[i].clear();
 39         edges.clear();
 40     }
 41
 42     void AddEdge(int from,int to,int cap)
 43     {
 44         edges.push_back( Edge(from,to,cap,0) );
 45         edges.push_back( Edge(to,from,0,0) );
 46         m=edges.size();
 47         G[from].push_back(m-2);
 48         G[to].push_back(m-1);
 49     }
 50
 51     bool BFS()
 52     {
 53         queue<int> Q;
 54         memset(vis,0,sizeof(vis));
 55         vis[s]=true;
 56         d[s]=0;
 57         Q.push(s);
 58         while(!Q.empty())
 59         {
 60             int x=Q.front(); Q.pop();
 61             for(int i=0;i<G[x].size();++i)
 62             {
 63                 Edge& e=edges[G[x][i]];
 64                 if(!vis[e.to] && e.cap>e.flow)
 65                 {
 66                     vis[e.to]=true;
 67                     d[e.to]=d[x]+1;
 68                     Q.push(e.to);
 69                 }
 70             }
 71         }
 72         return vis[t];
 73     }
 74
 75     int DFS(int x,int a)
 76     {
 77         if(x==t || a==0) return a;
 78         int flow=0, f;
 79         for(int &i=cur[x];i<G[x].size();++i)
 80         {
 81             Edge &e=edges[G[x][i]];
 82             if(d[e.to]==d[x]+1 && (f=DFS(e.to,min(a,e.cap-e.flow) ) )>0)
 83             {
 84                 e.flow +=f;
 85                 edges[G[x][i]^1].flow -=f;
 86                 flow +=f;
 87                 a -=f;
 88                 if(a==0) break;
 89             }
 90         }
 91         return flow;
 92     }
 93
 94     int Maxflow(int s,int t)
 95     {
 96         this->s=s; this->t=t;
 97         int flow=0;
 98         while(BFS())
 99         {
100             memset(cur,0,sizeof(cur));
101             flow +=DFS(s,INF);
102         }
103         return flow;
104     }
105 }DC;
106
107 int n, m;
108 int src, dst;
109
110 bool solve(int x)
111 {
112     DC.init(dst+1);
113     for(int i=1;i<=n;i++)
114     {
115         DC.AddEdge(src,i,1);
116         for(int j=0;j<g[i].size();j++)
117         {
118             DC.AddEdge(i,g[i][j]+n+1,1);
119         }
120     }
121     for(int i=1;i<=m;i++)
122         DC.AddEdge(i+n,dst,x);
123
124     if(DC.Maxflow(src,dst)==n)  return true;
125     else return false;
126 }
127
128 int main()
129 {
130     //freopen("in.txt","r",stdin);
131     while(~scanf("%d%d",&n,&m) && (n+m))
132     {
133         for(int i=1;i<=n;i++)  g[i].clear();
134         src=0, dst=n+m+1;
135
136         for(int i=1;i<=n;i++)
137         {
138             char name[20]; char c; int x;
139
140             cin>>name;
141             while(~scanf("%d%c",&x,&c))
142             {
143                 g[i].push_back(x);
144                 if(c=='\n')  break;
145             }
146         }
147
148         int ans=0;
149         int L=0,R=n;
150         while(L<=R)
151         {
152             int mid=(L+R)/2;
153             if(solve(mid))  {ans=mid;R=mid-1;}
154             else L=mid+1;
155         }
156         printf("%d\n",ans);
157     }
158     return 0;
159 }

转载于:https://www.cnblogs.com/zyb993963526/p/7262091.html

LA 3268 号码簿分组(最大流+二分)相关推荐

  1. BZOJ 1305 dance跳舞(最大流+二分答案)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1305 解题思路: 转自:https://blog.csdn.net/u012288458 ...

  2. UVALive - 3231 Fair Share(最大流+二分)

    题目链接:点击查看 题目大意:给出n个处理器和m个任务,每个任务给出可以运行的两个处理器,只需要其中一个处理器完成即可, 问如何分配处理方案,能使得n个处理器中处理任务最多的处理器所处理的任务最少 题 ...

  3. HDU - 3126 Nova(最大流+二分+简单几何)

    题目链接:点击查看 题目大意:给出一个二维平面坐标系,其中有n个巫师,m个敌人,以及k棵树,规定每个巫师都有一个攻击范围,可以攻击以巫师为圆心,以攻击范围为半径,形成的圆内的所有敌人,对于每棵树都有一 ...

  4. BZOJ2406矩阵——有上下界的可行流+二分答案

    题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 ...

  5. 51nod 1128 正整数分组 V2(二分)

    给出一个长度为N的正整数数组,不改变数组元素的顺序,将这N个数分为K组.各组中元素的和分别为S1,S2....Sk.如何分组,使得S1至Sk中的最大值最小? 例如:1 2 3 4 5 6分为3组,{1 ...

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

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

  7. 【BZOJ - 3993】星际战争(网络流最大流+二分)

    题干: 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型机器人的装甲值减少 ...

  8. Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!

    前一篇文章介绍了Spring Cloud Gateway的一些基础知识点,今天陈某就来唠一唠网关层面如何做限流? 文章目录如下: 网关如何限流? Spring Cloud Gateway本身自带的限流 ...

  9. Stream流与Lambda表达式(三) 静态工厂类Collectors

    /*** @author 陈杨*/@SpringBootTest @RunWith(SpringRunner.class) public class CollectorsDetail {private ...

  10. 网关流控利器:结合 AHAS 实现 Ingress/Nginx 流量控制

    作者:涂鸦 微服务的稳定性一直是开发者非常关注的话题.随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间的依赖关系变得越来越复杂,业务系统也面临着巨大的高可用挑战.应用高可用服务 AHAS ...

最新文章

  1. 数据库期末复习之并发控制
  2. python自动批量发邮件脚本_Python实现自动发送邮件功能
  3. -Xlint:deprecation
  4. Java集合框架之接口Collection源码分析
  5. as3 的3Dwebgame引擎Dgame3D正式开源
  6. apache sentry
  7. Service Broadcast简单音乐播放功能
  8. 扫雷游戏网页版_梦幻西游出网页版,王者出新英雄阿古朵,谁在杀死国产游戏的创新...
  9. win10系统找不到telnet服务器,win10系统找不到Telnet服务的技巧介绍
  10. destoon php文件,Destoon 任意文件读取
  11. 洛谷 P1757 通天之分组背包 C++ dp
  12. Modbus通讯协议(四)——Java实现ModbusTCP Slave(从机)
  13. C#使用 MailKit获取邮件中的附件(QQ邮箱/163网易邮箱)
  14. 宝塔面板服务器ip地址修改_宝塔,云帮手服务器控制面板,你用的哪一款?
  15. 系统日志及数据库日志
  16. 故障-未识别的网络的几种情况
  17. 手把手教你制作一目了然的可视化地图
  18. Java中文生僻字排序
  19. 网络基础 — 路由器的原理和作用
  20. c语言处理用户错误输入,C语言实现用户输入

热门文章

  1. dlib 怎么安装vs2017_VS2017+DLib_19.17详细配置教程
  2. throw new exception 后程序未中断_Java异常Exception-checked、unchecked
  3. python个人所得税怎么写_Python实现的个人所得税计算器示例
  4. Mysql 查询当月时间数据
  5. UNIX-LINUX编程实践教程-第五章-实例代码注解-echostate.c
  6. Apache RewriteCond on HTTP_COOKIE
  7. GridView控件事件详解
  8. 数理统计-随机变量的数字特征:期望、方差、协方差、矩、协方差矩阵
  9. [转]Git详解之三 Git分支
  10. 云计算的2.0进化体现?区块链分化处理能力掀全球去中心化热潮