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的更多相关文章

  1. 【HDOJ】3416 Marriage Match IV

    先求SPSS.然后遍历每条边,检查是否为最短路径的边,如果是(dis[v]==dis[u]+w)则加入到网络流中.最后Dinic最大流. /* 3416 */ #include <iostrea ...

  2. HDU 3277 Marriage Match III(二分+最大流)

    HDU 3277 Marriage Match III 题目链接 题意:n个女孩n个男孩,每一个女孩能够和一些男孩配对,此外还能够和k个随意的男孩配对.然后有些女孩是朋友,满足这个朋友圈里面的人.假设 ...

  3. HDU 3277 Marriage Match III

    Marriage Match III Time Limit: 4000ms Memory Limit: 32768KB This problem will be judged on HDU. Orig ...

  4. HDU 3277 Marriage Match III(并查集+二分答案+最大流SAP)拆点,经典

    Marriage Match III Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. 【HDOJ】1406 Ferry Loading III

    模拟,注意需要比较队头与当前时间的大小关系. #include <cstdio> #include <cstring> #include <cstdlib> #de ...

  6. 【CF981F】Round Marriage(二分答案,二分图匹配,Hall定理)

    [CF981F]Round Marriage(二分答案,二分图匹配,Hall定理) 题面 CF 洛谷 题解 很明显需要二分. 二分之后考虑如果判定是否存在完备匹配,考虑\(Hall\)定理. 那么如果 ...

  7. 【LeetCode】732. My Calendar III解题报告

    [LeetCode]732. My Calendar III解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/my-calendar ...

  8. 【LeetCode】170. Two Sum III – Data structure design

    Difficulty:easy  More:[目录]LeetCode Java实现 Description Design and implement a TwoSum class. It should ...

  9. 【HDOJ】1914 The Stable Marriage Problem

    稳定婚姻问题,Gale-Shapley算法可解. /* 1914 */ #include <iostream> #include <sstream> #include < ...

随机推荐

  1. 有理数类 Java

    public class Rational extends Number implements Comparable { private long numerator;// 分子 private lo ...

  2. asp.net 用jquery判断fileupload上传文件的大小和类型和名字

    <script language="javascript" type="text/javascript"> //检查上传文件大小和获取文件名 fun ...

  3. javascript 基础1第11节

    <html> <head> <title>javascript基础</title> </head> <body> 1.NaN i ...

  4. angularJS的核心特性

    前几天师傅让我了解一下angularJS,angularJS是一个前端框架,具体的优缺点和运用场景我现在也还没有搞清楚,暂时就先不做描述了,留到运用以后进行补充吧. angularJS四大核心特性:M ...

  5. http 请求头

    HTTP Request的Header信息 1.HTTP请求方式 如下表: GET 向Web服务器请求一个文件 POST 向Web服务器发送数据让Web服务器进行处理 PUT 向Web服务器发送数据并 ...

  6. 删除Windows右键不用的选项

    1.使用QQ电脑管家或者360的,一般都有小工具. 2.管理注册表 █以WindowsXP(SP2)为例,有些右键菜单中的选项你并不常用,或者有些软件已被删除,但其仍然占据着右键菜单.要删除这些无用的 ...

  7. IOS 学习笔记 2015-03-18

    Objective--C 一 关键字 1 KVC 动态设值,动态取值,类似雨java中的反射,而且私有的照样可以设置与获取 2 二 函数 1 retain 给对象引用计数器 + 1 2 release ...

  8. (转)myrepo

    源作者主页:https://copr.fedoraproject.org/coprs/mosquito/myrepo/ 源作者github: https://github.com/1dot75cm/m ...

  9. webstorm快捷方式

    刚开始在使用webstrom的时候,不知道快捷方式,感觉自己把webstorm当做记事本使用,真的挺傻的,在朋友的指导下,原来webstorm有快捷方式 一.界面操作 快捷键 说明 ctrl+shif ...

  10. JS对于字符串的切割截取

    对于字符串的切割截取平时所用可能不是特别多,而且分的比较细,所以自备自查.有备无患. 由于之前所有均在一个demo测试,若是哪里打错了,敬请谅解.一些其余属性找时间继续添加. 1.函数:split() ...