2019 Petrozavodsk Winter Camp, Yandex Cup C. Diverse Singing 上下界网络流
建图一共建四层 第一层为N个歌手 第二层为{pi,li} 第三层为{si,li} 第四层为M首歌
除了S和第一层与第三层与T之间的边为[1,INF] 其他边均为[0,1]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef int JQK;
const JQK INF = ;
struct node {
int p, s, l;
bool operator <(const node &rhs) const {
if (p != rhs.p)
return p > rhs.p;
else {
if (s != rhs.s)
return s > rhs.s;
else
return l > rhs.l;
}
}
} nodecnt;
int n, m, k, s1, t1, s2, t2;
map<pair<int, int>, int> pl, sl;
map<int, pair<int, int> > plb, slb;
map<node, int> psl;
vector<int> anser;
namespace dinic {
const int MAXN = ;
const int MAXM = ;
const JQK INF = ;
int Head[MAXN], cur[MAXN], lev[MAXN], to[MAXM << ], nxt[MAXM << ], ed = ;
int S, T, SS, TT, MAXP;
JQK f[MAXM << ], totflow[MAXN];
inline void addedge(int u, int v, JQK cap) {
to[++ed] = v;
nxt[ed] = Head[u];
Head[u] = ed;
f[ed] = cap;
to[++ed] = u;
nxt[ed] = Head[v];
Head[v] = ed;
f[ed] = ;
return;
}
inline void add(int u, int v, JQK caplow, JQK captop) {
addedge(u, v, captop - caplow);
totflow[u] -= caplow, totflow[v] += caplow;
return ;
}
inline bool BFS() {
int u;
for (int i = ; i <= MAXP + ; i++) {
lev[i] = -;
}
//memset(lev, -1, sizeof(lev));
queue<int>q;
lev[S] = ;
q.push(S);
while (q.size()) {
u = q.front();
q.pop();
for (int i = Head[u]; i; i = nxt[i])
if (f[i] && lev[to[i]] == -) {
lev[to[i]] = lev[u] + ;
q.push(to[i]);
/*
if (to[i] == T)
{
return 1;
}
magic one way optimize
*/
}
}
for (int i = ; i <= MAXP + ; i++) {
cur[i] = Head[i];
}
//memcpy(cur, Head, sizeof Head);
return lev[T] != -;
}
inline JQK DFS(int u, JQK maxf) {
if (u == T || !maxf) {
return maxf;
}
JQK cnt = , tem;
for (int &i = cur[u]; i; i = nxt[i])
if (f[i] && lev[to[i]] == lev[u] + ) {
tem = DFS(to[i], min(maxf, f[i]));
maxf -= tem;
f[i] -= tem;
f[i ^ ] += tem;
cnt += tem;
if (!maxf) {
break;
}
}
if (!cnt) {
lev[u] = -;
}
return cnt;
}
JQK Dinic() {
JQK ans = ;
while (BFS()) {
ans += DFS(S, INF);
}
return ans;
}
void del(int x) {
for (int i = Head[x]; i; i = nxt[i])
f[i] = f[i ^ ] = ;
}
void init(int S1, int T1, int S2, int T2) {
for (int i = ; i <= MAXP + ; i++) {
totflow[i] = Head[i] = ;
}
ed = ;
S = S1;
T = T1;
SS = S2;
TT = T2;
return;
}
inline JQK pushdownflow(int x) {
JQK sum = ;
for (int i = ; i <= x; i++) {
if (totflow[i] > ) {
addedge(SS, i, totflow[i]);
sum += totflow[i];
} else if (totflow[i] < ) {
addedge(i, TT, -totflow[i]);
}
}
return sum;//sum==dinic 循环流有解
}
JQK work() { //有源汇最大流
JQK ans = ;
JQK sum = pushdownflow(TT - );
addedge(T, S, INF);
swap(S, SS), swap(T, TT);
if (sum != Dinic()) { //Dinic(SS,TT) 求出一个有源汇有上下界可行流.此时的流不一定最大.
cout << - << endl;
return ;
}
ans = f[ed]; //可行流流量
f[ed] = f[ed ^ ] = ;
swap(S, SS), swap(T, TT); //Dinic(S,T)
ans += Dinic();//新增广出的s-t流量
cout << ans << endl;
for (int i = n + m + ; i <= n + m + k; i++) {
for (int j = Head[i]; j; j = nxt[j]) {
int v = to[j];
if (v >= n + m + k + && v <= n + m + * k && f[j] == ) {
nodecnt.p = plb[i].first;
nodecnt.s = slb[v].first;
nodecnt.l = slb[v].second;
anser.push_back(psl[nodecnt]);
}
}
}
sort(anser.begin(), anser.end());
for (int v : anser) {
cout << v << " ";
}
return ans;
}
}
int main() {
int u, v;
JQK c;
scanf("%d %d %d", &n, &m, &k);
dinic::MAXP = n + m + * k + ;
s1 = n + m + * k + ;
t1 = s1 + ;
s2 = t1 + ;
t2 = s2 + ;
dinic::init(s1, t1, s2, t2); //S T SS TT
for (int i = ; i <= n; i++)
dinic::add(s1, i, , INF);
for (int i = n + ; i <= n + m; i++)
dinic::add(i, t1, , INF);
for (int i = ; i <= k; i++) {
scanf("%d %d %d", &u, &v, &c);
nodecnt.p = u, nodecnt.s = v, nodecnt.l = c;
if (!psl[nodecnt])
psl[nodecnt] = i;
if (!pl[make_pair(u, c)]) {
pl[make_pair(u, c)] = n + m + i;
plb[n + m + i] = make_pair(u, c);
dinic::add(u, n + m + i, , );
}
if (!sl[make_pair(v, c)]) {
sl[make_pair(v, c)] = n + m + k + i;
slb[n + m + k + i] = make_pair(v, c);
dinic::add(n + m + k + i, n + v, , );
}
dinic::add(pl[make_pair(u, c)], sl[make_pair(v, c)], , );
}
dinic::work();
return ;
}
2019 Petrozavodsk Winter Camp, Yandex Cup C. Diverse Singing 上下界网络流的更多相关文章
- 2018 Petrozavodsk Winter Camp, Yandex Cup
A. Ability Draft solved by RDC 60min start, 148 min AC, 1Y 题意:两只 Dota 队伍,每队 \(n\) 个英雄,英雄一开始无技能,他们需要按 ...
- 2019 wannafly winter camp day 3
2019 wannafly winter camp day 3 J 操作S等价于将S串取反,然后依次遍历取反后的串,每次加入新字符a,当前的串是T,那么这次操作之后的串就是TaT.这是第一次转化. 涉 ...
- 2019 wannafly winter camp
2019 wannafly winter camp Name Rank Solved A B C D E F G H I J K day1 9 5/11 O O O O O day2 5 3/11 O ...
- Petrozavodsk Winter Camp, Warsaw U, 2014, A The Carpet
一个地图上有若干障碍,问允许出现一个障碍的最大子矩形为多大? 最大子矩形改编 #include<bits/stdc++.h> using namespace std; #define re ...
- Petrozavodsk Winter Camp, Day 8, 2014, Ship
$dp(i,j)$表示i-j这段还没运走时的状态,包括 运输了多少次,还剩多少空间 每次枚举运输左边还是右边转移 #include <bits/stdc++.h> #define rep( ...
- Petrozavodsk Winter Camp, Day 8, 2014, Fine Brochures
1的个数-块的个数+多减的个数+flag 多减的只会在一个循环末尾出现 #include <bits/stdc++.h> using namespace std; #define rep( ...
- Petrozavodsk Winter Camp, Day 8, 2014, Second Trip
给你一棵树,每次询问一个(a,b),问有多少有路径与a-b没有交集 找lca #include <bits/stdc++.h> using namespace std; #define r ...
- Petrozavodsk Winter Camp, Day 8, 2014, Mosaic
给你三个数字a,b,c,让你用1-m的数字凑出来 结论:有2个1和2个2肯定凑不出来,然后就搜索 #include <bits/stdc++.h> using namespace std; ...
- Petrozavodsk Winter Camp, Day 8, 2014, Rectangle Count
给一个n*m的格点图,问其中有多少个矩形? $ \sum_{x=1}^{nm} \sum_{ab=x} [a + b \leq n](n - a - b + 1)\sum_{cd=x} [c + d ...
随机推荐
- 可执行jar包与依赖jar包
1.在IDEA的pom文件中有如下配置的,打包出来的是可执行jar包,可执行jar包不能作为依赖. <build> <plugins> <plugin> <g ...
- 【DSP开发】硬件信号量在多核处理器核间通信中的应用
硬件信号量在多核处理器核间通信中的应用 刘德保1,汪安民1,韩道文2 1.同方电子科技有限公司研究所,九江 332009:2.解放军电子工程学院 摘要: 在多核处理器的软件设计中,核间通信机制是关键所 ...
- OpenCV.物体识别
1.度娘:“OpenCV 物体识别” 1.1.opencv实时识别指定物体 - 诺花雨的博客 - CSDN博客.html(https://blog.csdn.net/qq_27063119/artic ...
- 转换函数conversion function
类转换分为两个角度 转换自身为其他类型 把其他类型转换为自身 Example: 这里我们可以将b转换为class xxx 的类型(方式2),也可以将me转换为double,然后再讲结果转换为doubl ...
- bootstrap-table的一些配置参数例子
$('#reportTable').bootstrapTable({ method: 'post', url: '/qStock/AjaxPage', dataType: "json&quo ...
- SpreadJS:一款高度类似Excel的开发工具,功能涵盖Excel的 95% 以上
Excel 作为一款深受用户喜爱的电子表格工具,借助其直观的界面.出色的计算性能.数据分析和图表,已经成为数据统计领域不可或缺的软件之一. 基于Excel对数据处理与分析的卓越表现,把Excel的功能 ...
- ajax提交 的编码小结
今天用ajax的post方法提交数据给webservice,由于有email的缘故发现,注册方法调用总是报错,打开报文一看提交的 发现@符号被变成了%40 , abc@126.com 即abc%401 ...
- Oracle数据库连接工具的使用(一)
一.企业管理器(OEM) 1.介绍 Oracle企业管理器(Oracle Enterprise Manager)简称OEM,是一个基于Java的框架系统,该系统集成了多个组件,为用户提供了一个功能强大 ...
- 基于DBMS_METADATA.GET_DDL函数批量导出索引的创建语句
/* 首先要说的DBMS_METADATA.GET_DDL是个好函数呀!新项目不知道哪个缺心眼建的同构库,只是见了表结构,并没有健非主键外的索引,领导让追加一版,以前只是会用视图拼sql创建,今天有学 ...
- Symfony 服务配置 看这一篇就够了
对于刚接触 Symfony 的新手来说,如何配置服务是一件很困难的事情.虽然在 Symfony 的新版本的框架中加入了自动加载(autowire),基本上满足了一般的需求,但是如果你想深入了解“服务” ...