【HDOJ】3277 Marriage Match III
Dinic不同实现的效率果然不同啊。
/* 3277 */
#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 INF = 0x1f1f1f1f;
const int maxn = ;
const int maxm = maxn*maxn;
const int maxv = maxn*;
const int maxe = maxv*maxv*;
bool M[maxn][maxn];
int V[maxe], F[maxe], F_[maxe], nxt[maxe];
int dis[maxv], head[maxv], head_[maxv], Q[maxv];
int pre[maxn];
int X[maxm], Y[maxm];
int s, t;
int n, m; void addEdge(int u, int v, int c) {
#ifndef ONLINE_JUDGE
printf("u = %d, v = %d, c = %d\n", u, v, c);
#endif
V[m] = v;
F_[m] = c;
nxt[m] = head[u];
head[u] = m++; V[m] = u;
F_[m] = ;
nxt[m] = head[v];
head[v] = m++;
} int find(int x) {
if (x == pre[x])
return x;
return pre[x] = find(pre[x]);
} void merge(int x, int y) {
int fx = find(x);
int fy = find(y); if (fx != fy)
pre[fx] = fy;
} bool bfs() {
int l = , r = ;
int u, v, k; memset(dis, , sizeof(dis));
Q[r++] = s;
dis[s] = ; while (l < r) {
u = Q[l++];
for (k=head[u]; k!=-; k=nxt[k]) {
v = V[k];
if (!dis[v] && 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=nxt[k]) {
v = V[k];
if (F[k] && dis[v]==dis[u]+ && (tmp=dfs(v, min(val, 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;
}
} return ret;
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int tt;
int c, K, f;
int x, y;
int l, r, mid;
int ans, tmp; scanf("%d", &tt);
while (tt--) {
scanf("%d %d %d %d", &n, &c, &K, &f);
rep(i, , c)
scanf("%d %d", &X[i], &Y[i]);
rep(i, , n+)
pre[i] = i;
while (f--) {
scanf("%d %d", &x, &y);
merge(x, y);
} m = ;
s = *n+;
t = s + ;
memset(head, -, sizeof(head));
memset(M, false, sizeof(M)); rep(i, , n+) {
find(i);
addEdge(s, i, );
addEdge(i+n*, t, );
}
rep(i, , n+)
addEdge(i, i+n, K); rep(i, , c) {
x = X[i];
y = Y[i];
rep(j, , n+) {
if (pre[x]==pre[j] && !M[j][y]) {
M[j][y] = true;
addEdge(j, y+n*, );
}
}
} rep(i, , n+) {
rep(j, , n+) {
if (!M[i][j]) {
addEdge(i+n, j+n*, );
}
}
} l = ;
r = n;
ans = ; while (l <= r) {
mid = (l + r) >> ;
for (int i=; i<*n; i+=) {
F[i] = F[i+] = mid;
F[i+] = F[i+] = ;
}
rep(i, *n, m)
F[i] = F_[i];
tmp = Dinic();
#ifndef ONLINE_JUDGE
printf("tmp = %d\n", tmp);
#endif
if (tmp >= mid*n) {
ans = mid;
l = mid + ;
} else {
r = mid - ;
}
} printf("%d\n", ans);
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}
【HDOJ】3277 Marriage Match III的更多相关文章
- 【HDOJ】3416 Marriage Match IV
先求SPSS.然后遍历每条边,检查是否为最短路径的边,如果是(dis[v]==dis[u]+w)则加入到网络流中.最后Dinic最大流. /* 3416 */ #include <iostrea ...
- HDU 3277 Marriage Match III(二分+最大流)
HDU 3277 Marriage Match III 题目链接 题意:n个女孩n个男孩,每一个女孩能够和一些男孩配对,此外还能够和k个随意的男孩配对.然后有些女孩是朋友,满足这个朋友圈里面的人.假设 ...
- HDU 3277 Marriage Match III
Marriage Match III Time Limit: 4000ms Memory Limit: 32768KB This problem will be judged on HDU. Orig ...
- HDU 3277 Marriage Match III(并查集+二分答案+最大流SAP)拆点,经典
Marriage Match III Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 【HDOJ】1406 Ferry Loading III
模拟,注意需要比较队头与当前时间的大小关系. #include <cstdio> #include <cstring> #include <cstdlib> #de ...
- 【CF981F】Round Marriage(二分答案,二分图匹配,Hall定理)
[CF981F]Round Marriage(二分答案,二分图匹配,Hall定理) 题面 CF 洛谷 题解 很明显需要二分. 二分之后考虑如果判定是否存在完备匹配,考虑\(Hall\)定理. 那么如果 ...
- 【LeetCode】732. My Calendar III解题报告
[LeetCode]732. My Calendar III解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/my-calendar ...
- 【LeetCode】170. Two Sum III – Data structure design
Difficulty:easy More:[目录]LeetCode Java实现 Description Design and implement a TwoSum class. It should ...
- 【HDOJ】1914 The Stable Marriage Problem
稳定婚姻问题,Gale-Shapley算法可解. /* 1914 */ #include <iostream> #include <sstream> #include < ...
随机推荐
- ASP.NET MVC 使用Echarts
Echarts官网 页面配置: <!DOCTYPE html> <html> <head> <meta name="viewport" c ...
- eclipse Ctrl+1 没反应
今天上午写代码,突然发现Ctrl+1没反应了,顿时无语.昨天还好好的,今天就不行了…… 无奈,只好在网上查了查,据说快捷键冲突的原因比较大. 于是我将Ctrl+1换成了Alt+1.在eclipse中测 ...
- MVC小系列(三)【MVC的分部视图】
MVC的分部视图: 分部视图在action中返回一定要用PartialView(),而不要偷懒使用View(),因为如果使用后者,系统会认为是一个标准视图,会为它加个默认的母版页(LayOut),除非 ...
- Android开发环境搭建(2015年8月更新)
1. 下载和安装Android SDK Android的官方站点是http://www.android.com: 登录https://developer.android.com/intl/zh-cn ...
- 淘宝可以传照片搜索商品,verygood.雅客VC多味水果糖
奶奶喜欢吃点硬糖.在当地买了些说是不好.到是一个亲戚买的一种糖比较满意(好久了都快融化了). 但是我只有照片,能知道品牌,在jd没这样一样的商品了. 还好借助淘宝的传照片功能,找到了.
- 配置php连接apache
配置php连接apache 1.安装php所需要的库 yum install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel li ...
- android studio 自动序列化类插件
https://github.com/mcharmas/android-parcelable-intellij-plugin
- SSH框架jar神包
SSH JAR包链接(https://zhidao.baidu.com/share/ac8b1389bac84023d7442cad88f3933c.html)
- MySQL - “Timeout error occurred trying to start MySQL Daemon”解决方法
前几天,网站出现Many connections的问题,进入mysql,show full processlist发现有154个进程,晕....直接service mysqld restart 但是不 ...
- C#中线程的用法
通过委托的方式创建线程 static int sum(int x) { return x+x; { Func<int> a = sum; 创建一个新的线程格式:a.BeginInvoke( ...