费用流 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- 单例
单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...
- Jquery获取select 控件的change事件时选中的值
HTML代码如下: <div class="col-sm-9 col-xs-12"> <select id="groupid" class=& ...
- iOS中NSUserDefaults详解
NSUserDefault 作为iOS中一种轻量级数据本地化方式,简单易用,经常用于存储一些应用相关属性记录,例如图书app的背景色,进度,上次阅读的书籍及相关配置信息.NSUserDefault实质 ...
- [Android Pro] 关于inputStream.available()方法获取文件的总大小
reference to :http://hold-on.iteye.com/blog/1017449 如果用inputStream对象的available()方法获取流中可读取的数据大小,通常我们调 ...
- CLR via C#(18)——Enum
1. Enum定义 枚举类型是经常用的一种“名称/值”的形式,例如: public enum FeedbackStatus { New, Processing, ...
- HTML5学习之智能表单(二)
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- 在PYTHON3中,使用Asyncio来管理Event loop
#!/usr/bin/env python # -*- coding: utf-8 -*- import asyncio import datetime import time def functio ...
- oracle使用dbms_metadata包取得所有对象DDL语句
当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metadata.get_ddl这个包来查看. dbms_metadata包中的get_ddl函数详细参数 GET_DDL函数返回创建 ...
- JqueryEasyUI 解决IE下datagrid无法刷新的问题 分类: JavaScript JqueryEasyUI 2014-09-20 10:05 510人阅读 评论(1) 收藏
问题描述: 在使用JqueryEasyUI 时,发现在IE下$('#table').datagrid('reload');无效,数据并没有被刷新,究其原因,是因为刷新时,datagrid请求的url没 ...
- js判断当前的访问是手机/电脑
<script type="text/javascript"> var commonURL = 'http://www.xxx.com/'; function mobi ...