费用流 ZOJ 3933 Team Formation
题意:两个队伍,有一些边相连,问最大组对数以及最多女生数量
分析:费用流模板题,设置两个超级源点和汇点,边的容量为1,费用为男生数量.建边不能重复建边否则会T.zkw费用流在稠密图跑得快,普通的最小费用最大流也能过,只是相对来说慢了点.
#include <bits/stdc++.h> const int N = 5e2 + 5;
const int INF = 0x3f3f3f3f;
struct Min_Cost_Max_Flow {
struct Edge {
int from, to, cap, flow, cost;
};
std::vector<Edge> edges;
std::vector<int> G[N];
bool vis[N];
int d[N], p[N], a[N];
int n, m; void init(int n) {
this->n = n;
for (int i=0; i<=n; ++i) {
G[i].clear ();
}
edges.clear ();
}
void add_edge(int from, int to, int cap, int cost) {
edges.push_back ((Edge) {from, to, cap, 0, cost});
edges.push_back ((Edge) {to, from, 0, 0, -cost});
m = edges.size ();
G[from].push_back (m - 2);
G[to].push_back (m - 1);
}
bool SPFA(int s, int t, int &flow, int &cost) {
memset (d, INF, sizeof (d));
memset (vis, false, sizeof (vis));
memset (p, -1, sizeof (p));
d[s] = 0; vis[s] = true; p[s] = 0; a[s] = INF; std::queue<int> que; que.push (s);
while (!que.empty ()) {
int u = que.front (); que.pop ();
vis[u] = false;
for (int i=0; i<G[u].size (); ++i) {
Edge &e = edges[G[u][i]];
if (e.cap > e.flow && d[e.to] > d[u] + e.cost) {
d[e.to] = d[u] + e.cost;
p[e.to] = G[u][i];
a[e.to] = std::min (a[u], e.cap - e.flow);
if (!vis[e.to]) {
vis[e.to] = true;
que.push (e.to);
}
}
}
} if (d[t] == INF) {
return false;
}
flow += a[t];
cost += d[t] * a[t];
int u = t;
while (u != s) {
edges[p[u]].flow += a[t];
edges[p[u]^1].flow -= a[t];
u = edges[p[u]].from;
}
return true;
}
void run(int s, int t, int &flow, int &cost) {
flow = cost = 0;
while (SPFA (s, t, flow, cost)); printf ("%d %d\n", flow, 2 * flow - cost);
for (int i=0; i<edges.size (); i+=2) {
if (edges[i].from == s || edges[i].to == t || edges[i].flow == 0) {
continue;
}
printf ("%d %d\n", edges[i].from, edges[i].to);
}
}
};
Min_Cost_Max_Flow mcmf;
char group[N], sex[N];
bool list[N];
int n, m; int main() {
int T; scanf ("%d", &T);
while (T--) {
scanf ("%d", &n);
scanf ("%s", group + 1);
scanf ("%s", sex + 1); mcmf.init (n + 1);
int s = 0, t = n + 1;
for (int i=1; i<=n; ++i) {
if (group[i] == '0') {
mcmf.add_edge (s, i, 1, 0);
} else {
mcmf.add_edge (i, t, 1, 0);
}
int m; scanf ("%d", &m);
memset (list, false, sizeof (list));
for (int j=1; j<=m; ++j) {
int v; scanf ("%d", &v);
list[v] = true;
}
if (group[i] == '1') {
continue;
}
int cost = (sex[i] == '1');
for (int j=1; j<=n; ++j) {
if (list[j] || group[i] == group[j]) {
continue;
}
mcmf.add_edge (i, j, 1, cost + (sex[j] == '1'));
}
}
int flow, cost;
mcmf.run (s, t, flow, cost);
} return 0;
}
费用流 ZOJ 3933 Team Formation的更多相关文章
- ZOJ 3933 Team Formation
费用流裸题......比赛的时候少写了一句话....导致增加了很多无用的边一直在TLE #include<cstdio> #include<cstring> #include& ...
- 位运算 ZOJ 3870 Team Formation
题目传送门 /* 题意:找出符合 A^B > max (A, B) 的组数: 位运算:异或的性质,1^1=0, 1^0=1, 0^1=1, 0^0=0:与的性质:1^1=1, 1^0=0, 0^ ...
- Zoj 3870——Team Formation——————【技巧,规律】
Team Formation Time Limit: 3 Seconds Memory Limit: 131072 KB For an upcoming programming contes ...
- ZOJ 3870 Team Formation 贪心二进制
B - Team Formation Description For an upcoming progr ...
- ZOJ 3870 Team Formation 位运算 位异或用与运算做的
For an upcoming programming contest, Edward, the headmaster of Marjar University, is forming a two-m ...
- ZOJ - 3870 Team Formation(异或)
题意:给定N个数,求这N个数中满足A ⊕ B > max{A, B})的AB有多少对.(A,B是N中的某两个数) 分析: 1.异或,首先想到转化为二进制. eg:110011(A)和 1(B)- ...
- zoj The 12th Zhejiang Provincial Collegiate Programming Contest Team Formation
http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5494 The 12th Zhejiang Provincial ...
- ZOJ 3870:Team Formation(位运算&思维)
Team Formation Time Limit: 2 Seconds Memory Limit: 131072 KB For an upcoming programming contest, Ed ...
- UVALive 4863 Balloons 贪心/费用流
There will be several test cases in the input. Each test case will begin with a line with three inte ...
随机推荐
- IOS-01零碎知识总结
1. 变量的@public @private @package @protected 声明有什么含义? @public 可以被所有的类访问 @private 只有该类的方法可以访问,子类的都不能访 ...
- Java异常题库
一.填空题 __异常处理__机制是一种非常有用的辅助性程序设计方法.采用这种方法可以使得在程序设计时将程序的正常流程与错误处理分开,有利于代码的编写和维护. 在Java异常处理中可以使用多个catch ...
- C#冒泡排序
C#最简单的冒泡排序,需要的朋友可作参考: 思路: 使用两个for循环,就可以遍历数组,这样就可以确保每个数组元素都被使用 对比前后两个数,将小的数字和大的交换位置,引入一个临时变量temp来进行交换 ...
- checkbox复选框全选
HTML: <input type="checkbox" class="all"> <input type="checkbox&qu ...
- 关于内存管理/set/get方法
MRC状态下 1 任何继承NSObject的对象,存放于堆控件中,都需要手动管理内存 .2 基本数据类型放到栈中,对象放到堆空间中,内存是有系统管理的.(int\float\enum\struct) ...
- JavaWeb学习之JSTL自定义标签库的使用、JSTL自定义函数库(7)
一.自定义标签,步骤 * 确定需求 * <my:date /> 输出当前系统的时间 yyyy-MM-dd hh:mm:ss:SSS * 编写Java类 新建包名:com.yxl.tag,新 ...
- 【PHP&&FileIO】
在程序员的眼中,文件不应当仅仅是一部电影.一首歌曲.一个pdf文件,它应该被视为一个文件夹,而我们所熟知的文件,应当是它的特例. 在web开发中,文件的上传和下载是文件变成的一个实际应用. 延续cru ...
- Big Data, MapReduce, Hadoop, and Spark with Python
此书不错,很短,且想打通PYTHON和大数据架构的关系. 先看一次,计划把这个文档作个翻译. 先来一个模拟MAPREDUCE的东东... mapper.py class Mapper: def map ...
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- C# SMTP邮件发送 分类: C# 2014-07-13 19:10 333人阅读 评论(1) 收藏
邮件发送在网站应用程序中经常会用到,包括您现在看到的博客,在添加评论后,系统会自动发送邮件通知到我邮箱的,把系统发送邮件的功能整理了下,做了一个客户端Demo,希望对有需要的童鞋有所帮助: 核心代码: ...