【HDOJ】1669 Jamie's Contact Groups
二分+二分图多重匹配。
- /* 1669 */
- #include <iostream>
- #include <string>
- #include <map>
- #include <queue>
- #include <set>
- #include <stack>
- #include <vector>
- #include <deque>
- #include <algorithm>
- #include <cstdio>
- #include <cmath>
- #include <ctime>
- #include <cstring>
- #include <climits>
- #include <cctype>
- #include <cassert>
- #include <functional>
- #include <iterator>
- #include <iomanip>
- using namespace std;
- //#pragma comment(linker,"/STACK:102400000,1024000")
- #define sti set<int>
- #define stpii set<pair<int, int> >
- #define mpii map<int,int>
- #define vi vector<int>
- #define pii pair<int,int>
- #define vpii vector<pair<int,int> >
- #define rep(i, a, n) for (int i=a;i<n;++i)
- #define per(i, a, n) for (int i=n-1;i>=a;--i)
- #define clr clear
- #define pb push_back
- #define mp make_pair
- #define fir first
- #define sec second
- #define all(x) (x).begin(),(x).end()
- #define SZ(x) ((int)(x).size())
- #define lson l, mid, rt<<1
- #define rson mid+1, r, rt<<1|1
- const int maxn = ;
- const int maxm = ;
- bool M[maxn][maxm];
- bool visit[maxm];
- int can[maxm][maxm];
- int sz[maxm];
- int n, gn, bound;
- bool dfs(int u) {
- rep(i, , gn) {
- if (M[u][i] && !visit[i]) {
- visit[i] = true;
- if (sz[i] < bound) {
- can[i][sz[i]++] = u;
- return true;
- }
- rep(j, , sz[i]) {
- if (dfs(can[i][j])) {
- can[i][j] = u;
- return true;
- }
- }
- }
- }
- return false;
- }
- bool judge(int bound_) {
- bound = bound_;
- memset(sz, , sizeof(sz));
- rep(i, , n) {
- memset(visit, false, sizeof(visit));
- if (!dfs(i))
- return false;
- }
- return true;
- }
- void solve() {
- int l, r, mid;
- int ans;
- l = ;
- ans = r = n;
- while (l <= r) {
- mid = (l + r) >> ;
- if (judge(mid)) {
- ans = mid;
- r = mid - ;
- } else {
- l = mid + ;
- }
- }
- printf("%d\n", ans);
- }
- int main() {
- ios::sync_with_stdio(false);
- #ifndef ONLINE_JUDGE
- freopen("data.in", "r", stdin);
- freopen("data.out", "w", stdout);
- #endif
- char name[];
- int gid;
- char ch;
- while (scanf("%d %d", &n, &gn)!=EOF && (n||gn)) {
- memset(M, false, sizeof(M));
- rep(i, , n) {
- scanf("%s", name);
- while () {
- scanf("%d%c", &gid, &ch);
- M[i][gid] = true;
- if (ch == '\n')
- break;
- }
- }
- solve();
- }
- #ifndef ONLINE_JUDGE
- printf("time = %d.\n", (int)clock());
- #endif
- return ;
- }
二分+网络流Dinic也可以解。
- /* 1669 */
- #include <iostream>
- #include <string>
- #include <map>
- #include <queue>
- #include <set>
- #include <stack>
- #include <vector>
- #include <deque>
- #include <algorithm>
- #include <cstdio>
- #include <cmath>
- #include <ctime>
- #include <cstring>
- #include <climits>
- #include <cctype>
- #include <cassert>
- #include <functional>
- #include <iterator>
- #include <iomanip>
- using namespace std;
- //#pragma comment(linker,"/STACK:102400000,1024000")
- #define sti set<int>
- #define stpii set<pair<int, int> >
- #define mpii map<int,int>
- #define vi vector<int>
- #define pii pair<int,int>
- #define vpii vector<pair<int,int> >
- #define rep(i, a, n) for (int i=a;i<n;++i)
- #define per(i, a, n) for (int i=n-1;i>=a;--i)
- #define clr clear
- #define pb push_back
- #define mp make_pair
- #define fir first
- #define sec second
- #define all(x) (x).begin(),(x).end()
- #define SZ(x) ((int)(x).size())
- #define lson l, mid, rt<<1
- #define rson mid+1, r, rt<<1|1
- typedef struct {
- int v, c, nxt;
- } Edge_t;
- const int INF = 0x3f3f3f3f;
- const int maxn = ;
- const int maxm = ;
- const int maxv = maxn + maxm;
- const int maxe = maxn*maxm*+;
- Edge_t E[maxe];
- int F[maxe];
- int head[maxv], head_[maxv];
- int id[maxm];
- int dis[maxv], Q[maxv];
- int m;
- int n, gn;
- int s, t;
- void init() {
- memset(head, -, sizeof(head));
- m = ;
- s = ;
- t = n + gn + ;
- }
- void addEdge(int u, int v, int c) {
- E[m].v = v;
- E[m].c = c;
- E[m].nxt = head[u];
- head[u] = m++;
- E[m].v = u;
- E[m].c = ;
- E[m].nxt = head[v];
- head[v] = m++;
- }
- bool bfs() {
- int l = , r = ;
- int u, v, k;
- Q[r++] = s;
- memset(dis, , sizeof(dis));
- dis[s] = ;
- while (l < r) {
- u = Q[l++];
- for (k=head[u]; k!=-; k=E[k].nxt) {
- v = E[k].v;
- if (!dis[v] && E[k].c>F[k]) {
- dis[v] = dis[u] + ;
- if (v == t)
- return false;
- Q[r++] = v;
- }
- }
- }
- return true;
- }
- int dfs(int u, int val) {
- if (u==t || val==)
- return val;
- int ret = ;
- int tmp, v;
- for (int& k=head_[u]; k!=-; k=E[k].nxt) {
- v = E[k].v;
- if (dis[v]==dis[u]+ && E[k].c>F[k] && (tmp=dfs(v, min(val, E[k].c-F[k])))>) {
- F[k] += tmp;
- F[k^] -= tmp;
- ret += tmp;
- val -= tmp;
- if (val == )
- break;
- }
- }
- return ret;
- }
- int Dinic() {
- int ret = , tmp;
- while () {
- if (bfs())
- break;
- memcpy(head_, head, sizeof(head));
- while () {
- tmp = dfs(s, INF);
- if (tmp == )
- break;
- ret += tmp;
- }
- }
- #ifndef ONLINE_JUDGE
- printf("Dinic = %d\n", ret);
- #endif
- return ret;
- }
- bool judge(int bound) {
- rep(i, , gn+)
- E[id[i]].c = bound;
- memset(F, , sizeof(F));
- return Dinic()>=n;
- }
- void solve() {
- int l = , r = n, mid;
- int ans = -;
- while (r >= l) {
- mid = (l + r) >> ;
- if (judge(mid)) {
- ans = mid;
- r = mid - ;
- } else {
- l = mid + ;
- }
- }
- printf("%d\n", ans);
- }
- int main() {
- ios::sync_with_stdio(false);
- #ifndef ONLINE_JUDGE
- freopen("data.in", "r", stdin);
- freopen("data.out", "w", stdout);
- #endif
- char name[];
- char ch;
- int gid;
- while (scanf("%d %d", &n, &gn)!=EOF && (n||gn)) {
- init();
- rep(i, , n+) {
- scanf("%s", name);
- while () {
- scanf("%d%c", &gid, &ch);
- addEdge(i, gid+n+, );
- if (ch == '\n')
- break;
- }
- }
- rep(i, , n+)
- addEdge(s, i, );
- rep(i, , gn+) {
- id[i] = m;
- addEdge(n+i, t, );
- }
- solve();
- }
- #ifndef ONLINE_JUDGE
- printf("time = %d.\n", (int)clock());
- #endif
- return ;
- }
【HDOJ】1669 Jamie's Contact Groups的更多相关文章
- HDU 1669 Jamie's Contact Groups(多重匹配+二分枚举)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1669 题目大意: 给你各个人可以属于的组,把这些人分组,使这些组中人数最多的组人数最少,并输出这个人数 ...
- poj 2289 Jamie's Contact Groups【二分+最大流】【二分图多重匹配问题】
题目链接:http://poj.org/problem?id=2289 Jamie's Contact Groups Time Limit: 7000MS Memory Limit: 65536K ...
- POJ 2289——Jamie's Contact Groups——————【多重匹配、二分枚举匹配次数】
Jamie's Contact Groups Time Limit:7000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I ...
- POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups / HDU 1699 Jamie's Contact Groups / SCU 1996 Jamie's Contact Groups (二分,二分图匹配)
POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups ...
- POJ2289 Jamie's Contact Groups(二分图多重匹配)
Jamie's Contact Groups Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 7721 Accepted: ...
- Jamie's Contact Groups POJ - 2289(多重匹配 最大值最小化 最大流)
Jamie's Contact Groups Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 8567 Accepted: ...
- POJ 2289 Jamie's Contact Groups 二分图多重匹配 难度:1
Jamie's Contact Groups Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 6511 Accepted: ...
- POJ2289:Jamie's Contact Groups(二分+二分图多重匹配)
Jamie's Contact Groups Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/ ...
- POJ2289 Jamie's Contact Groups —— 二分图多重匹配/最大流 + 二分
题目链接:https://vjudge.net/problem/POJ-2289 Jamie's Contact Groups Time Limit: 7000MS Memory Limit: 6 ...
随机推荐
- 利用微软类库 Visual Studio International Pack 汉字转拼音
首先,从微软官网下载安装包:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=44CAC7F0-633B-477D-AED2 ...
- Golden32 别名时中文 报ORA-00911: invalid character错误
查询数据库软件我一般用两个:PL SQL和golden32:使用golden32-之前使用的时候别名为中文是没有任何问题:直到我想将PL SQL汉化(使用中文包chinese.exe),汉化完后再次查 ...
- iOS UIView 快速修改 frame,
在iOS开发布局修改 frame 时需要繁琐的代码实现,今天偶尔看到一播客说到快速修改的 frame 的方法,自己动手写了一遍实现代码. 快速实现主要通过 添加类目的方式,对UIView 控件添加了一 ...
- ReactiveCocoa入门教程——第一部分(转)
作为一个iOS开发者,你写的每一行代码几乎都是在响应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation).但是这些事件都用不同的方式来处理 ...
- SQL 刪除
SQL 刪除 1.delete from table_name 2.drop table table_name drop table is different from deleting all of ...
- MySQL生产库主从重新同步操作注意事项
因为一些原因,我们会遇到生产主从库重新同步的时候.重新同步MYSQL主从的时候有有一些注意的地方. 从库还原前一定要记得reset,因为重启mysql并不影响复制进程,如果忘记reset,会导致你一边 ...
- 【JSP&Servlet学习笔记】4.会话管理
Http本身是无状态通信协议,要进行会话管理的基本原理,就是将需要维护的状态回应给浏览器,由浏览器在下次请求时主动发送状态信息,让Web应用程序“得知”请求之间的关联. 隐藏字段是将状态信息以窗体中看 ...
- jQuery—一些常见方法(3)【width(),innerWidth(),outerWidth()】
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- php class类的用法详细总结
以下是对php中class类的用法进行了详细的总结介绍,需要的朋友可以过来参考下 一:结构和调用(实例化): class className{} ,调用:$obj = new className(); ...
- VirtualBox 安装虚拟机时出现错误 VT-x features locked or unavailable in MSR.
修改安装好的虚拟机的cup的个数重新启动的时候报了上述错误. 参考博文:http://blog.csdn.net/zklth/article/details/7019990 错误:VT-x featu ...