UVALive - 3268 Jamie's Contact Groups(二分+最大流)
来源:互联网 发布:cad可以画网络拓扑图吗 编辑:程序博客网 时间:2024/04/29 22:42
题目大意:有n个人和m个组,一个人可能属于多个组,现在请你从某些组中去掉几个人,使得每个人都只属于一个组,且人数最多的组中人员数目达到最小
解题思路:最大值最小化,二分
建图就比较简单了,二分主要二分组别到超级汇点的容量
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>using namespace std;#define N 2010#define INF 0x3f3f3f3fstruct Edge{ int from, to, cap, flow; Edge() {} Edge(int from, int to, int cap, int flow) : from(from), to(to), cap(cap), flow(flow) {}};struct Dinic{ int n, m, s, t; vector<Edge> edges; vector<int> G[N]; bool vis[N]; int d[N], cur[N]; void init(int n) { this->n = n; for (int i = 0; i <= n; i++) { G[i].clear(); } edges.clear(); } void AddEdge(int from, int to, int cap) { edges.push_back(Edge(from, to, cap, 0)); edges.push_back(Edge(to, from, 0, 0)); int m = edges.size(); G[from].push_back(m - 2); G[to].push_back(m - 1); } bool BFS() { memset(vis, 0, sizeof(vis)); queue<int> Q; Q.push(s); vis[s] = 1; d[s] = 0; while (!Q.empty()) { int u = Q.front(); Q.pop(); for (int i = 0; i < G[u].size(); i++) { Edge &e = edges[G[u][i]]; if (!vis[e.to] && e.cap > e.flow) { vis[e.to] = true; d[e.to] = d[u] + 1; Q.push(e.to); } } } return vis[t]; } int DFS(int x, int a) { if (x == t || a == 0) return a; int flow = 0, f; for (int i = cur[x]; i < G[x].size(); i++) { Edge &e = edges[G[x][i]]; if (d[x] + 1 == d[e.to] && (f = DFS(e.to, min(a, e.cap - e.flow))) > 0) { e.flow += f; edges[G[x][i] ^ 1].flow -= f; flow += f; a -= f; if (a == 0) break; } } return flow; } int Maxflow(int s, int t) { this->s = s; this->t = t; int flow = 0; while (BFS()) { memset(cur, 0, sizeof(cur)); flow += DFS(s, INF); } return flow; } bool MinCut(int mid, int m, int n, int source, int sink) { for (int i = 0; i < edges.size(); i++) edges[i].flow = 0; for (int i = 0; i < m; i++) for (int j = 0; j < G[i].size(); j++) if (edges[G[i][j]].to == sink) edges[G[i][j]].cap = mid; int t = Maxflow(source, sink); if (t == n) { return true; } return false; }};Dinic dinic;int n, m, source, sink;int num[N], Max;char name[30]; void init() { source = n + m; sink = source + 1; memset(num, 0, sizeof(num)); dinic.init(sink); Max = -INF; int t; char c; for (int i = 0; i < n; i++) { dinic.AddEdge(source, m + i, 1); scanf("%s", name); c = getchar(); while (c != '\n') { scanf("%d", &t); dinic.AddEdge(m + i, t, 1); num[t]++; c = getchar(); } } for (int i = 0; i < m; i++) { Max = max(Max, num[i]); dinic.AddEdge(i, sink, num[i]); }}void solve() {// printf("Max is %d\n", Max); int l = 0, r = Max, mid, ans = 0; while (l <= r) { mid = (l + r) / 2; if (dinic.MinCut(mid, m, n, source, sink)) { r = mid - 1; ans = mid; } else l = mid + 1; } printf("%d\n", ans);}int main() { while (scanf("%d%d", &n, &m) != EOF && n + m) { init(); solve(); } return 0;}
0 0
- UVALive - 3268 Jamie's Contact Groups(二分+最大流)
- POJ2289 Jamie's Contact Groups 二分+最大流匹配
- POJ 2289 - Jamie's Contact Groups 二分+最大流
- UValive3268 Jamie's Contact Groups(二分+最大流)
- POJ 2289 Jamie's Contact Groups(二分+最大流)
- UVA 1345 - Jamie's Contact Groups(二分+最大流)
- uva 1345 Jamie's Contact Groups (最大流+二分)
- poj 2289 Jamie's Contact Groups 【二分 + 最大流】
- poj 2289 Jamie's Contact Groups【二分 + 最大流】
- POJ 2289 Jamie's Contact Groups(二分+最大流)
- Poj 2289 Jamie's Contact Groups 【最大流Dinic+二分】
- poj2289 Jamie's Contact Groups(二分答案+最大流)
- Jamie's Contact Groups UVALive
- LA 3268 Jamie's Contact Groups 最大流
- POJ 2289 Jamie's Contact Groups 二分+最大匹配
- (beginer) 网络流(最大流+二分) UVA 1345 - Jamie\'s Contact Groups
- poj 2289 —— Jamie's Contact Groups 二分+最大流
- poj 2289 Jamie's Contact Groups 二分+网络流
- HDU 5400 Arithmetic Sequence(数学,容斥)
- 华为机试题:字符串最后一个单词的长度
- UVA - 11082 Matrix Decompressing(最大流+行列模型)
- 【DirectX 2D游戏编程基础】directx 精灵绘图的应用,锚点与变换
- DFS解八皇后问题
- UVALive - 3268 Jamie's Contact Groups(二分+最大流)
- AJAX一些常用操作
- Round A APAC Test 2016 Problem D. gSnake 贪吃蛇 stl应用
- 阅读laravel源代码有感
- 《数据结构与算法分析》图论算法--邻接表与拓扑排序
- FAAC转换PCM为AAC
- Cocos2d-x/Cocos2d-js编译64位so库中遇到的问题
- cocos2d-x实现3D模型的换装系统的研究
- 集合框架相关知识点(二)