wannafly-day1 Problem A - Birthday

思路:队友贪心WA了,然后就没有然后了,自己也是第一次接触最小费用流的题。借这个题来学习一下,利用Spfa每次来找到一个最短的路径同时保存路径,每一次寻找最短路径就将这条路的最小费用流给剪掉,然后继续下次寻找最短路径。
附上代码,参考了网上,
#include<queue>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
#include<functional> using namespace std; const int maxn = 5e3 + ;
const int INF = 0x3f3f3f3f;
struct Edge{
int value, flow, to, rev;
Edge(){}
Edge(int a, int b, int c, int d) :to(a), value(b), flow(c), rev(d){}
};
vector<Edge> vec[maxn];
inline void Add(int from, int to, int flow, int value){
vec[from].push_back(Edge(to, value, flow, vec[to].size()));
vec[to].push_back(Edge(from, -value, , vec[from].size() - ));
}
bool book[maxn];//用于SPFA中标记是否在queue中
int cost[maxn];//用于存费用的最短路径
int pre[maxn];//用于存前结点
int pree[maxn];//用于存钱结点的vector中的下标 bool Spfa(int from, int to){
memset(book, false, sizeof book);
memset(cost, INF, sizeof cost);
book[from] = true;
//cout << cost[0] << " " << INF << endl;
cost[from] = ;
queue<int>que;
que.push(from);
while (!que.empty()){
int t = que.front();
book[t] = false;
que.pop();
for (int i = ; i < vec[t].size(); i++){
Edge& e = vec[t][i];
if (e.flow> && cost[e.to] > cost[t] + e.value){
cost[e.to] = cost[t] + e.value;
pre[e.to] = t;
pree[e.to] = i;
if (book[e.to] == false){
que.push(e.to);
book[e.to] = true;
}
}
}
}
return cost[to] != INF;
}
int Work(int from, int to){
int sum = ;
while (Spfa(from, to)){
int mflow = INF;//SPFA找到最短路径的最小容量
int flag = to;
while (flag != from){
mflow = min(mflow, vec[pre[flag]][pree[flag]].flow);
flag = pre[flag];
}
flag = to;
while (flag != from){
//cout << flag << " " << pre[flag] << " " << mflow << " " << vec[pre[flag]][pree[flag]].value << endl;
sum += vec[pre[flag]][pree[flag]].value*mflow;
vec[pre[flag]][pree[flag]].flow -= mflow;
vec[flag][vec[pre[flag]][pree[flag]].rev].flow += mflow;
flag = pre[flag];
}
}
return sum;
}
int main()
{
ios::sync_with_stdio(false); int n, m, a, b;
cin >> n >> m;
for (int i = ; i <= n; i++){
cin >> a >> b;
Add(i, a + n, , );
Add(i, b + n, , );
Add(, i, , );
}
for (int i = ; i <= m; i++){
for (int j = ; j <= ; j += ){
Add(i + n, m + n + , , j);
}
}
cout << Work(, m + n + ) << endl; return ;
}
wannafly-day1 Problem A - Birthday的更多相关文章
- 国庆集训 || Wannafly Day1
网址:https://www.nowcoder.com/acm/contest/201#question A.签到 手速石头剪刀布 #include <cstdio> #include & ...
- 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1
目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...
- ACM/ICPC Moscow Prefinal 2019 趣题记录
### Day1: ### **Problem C:** 设$k_i$为$[A, B]$中二进制第$i$位是1的数的个数. 给出$k_0 \cdots k_{63}$, 求出$[A, B]$ ...
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- 2020 wannafly camp 补题 day1
题目可以从牛客上找到. 最简单的一个题应该是B B. 密码学 这个应该就是倒着推,题目给了你加密的顺序,所以我们逆推这个就可以得到每一次加密前的字符串. 1H. 最大公约数 题目大意就是给你一个范围1 ...
- wannafly camp day1
题目描述: 恬恬的生日临近了.宇扬给她准备了一个大 蛋糕. 正如往常一样,宇扬在蛋糕上插了nnn支蜡烛,并把蛋糕分为mmm个区域.因为某种原因,他必须把第iii根蜡烛插在第aia\_iai个区域或第 ...
- 2020 CCPC Wannafly Winter Camp Day1 Div.1& F
#include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...
- 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)
题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...
- Codeforces 1167c(ccpc wannafly camp day1) News Distribution 并查集模板
题目: In some social network, there are nn users communicating with each other in mm groups of friends ...
- NOIp2016 Day1&Day2 解题报告
Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...
随机推荐
- 6. extjs panel layoutconfig属性
转自:https://blog.csdn.net/xingtianyiyun/article/details/7686811 layoutConfig: Object 这是一个包含指定布局详细属性的对 ...
- asp.net 4.0 尚未在服务商注册 您需要手动将web服务器配置为 ASP.NET4.0,这样您的网站才能正常进行。
VS2010打开项目出现的此问题 电脑先安装VS2010 然后安装VS2010 SP1补丁.然后安装VS2015 后来又安装了Framework4.6.1 用网上搜索到的平常方法无法解决此问题. 最后 ...
- 无线网络发射选址 2014年NOIP全国联赛提高组(二维前缀和)
P2038 无线网络发射器选址 题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南 ...
- uva 11292 The Dragon of Loowater(贪心)
题目大意: 你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头).村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶龙一个直径不超过x的头,且需要支付x个金币.如何雇佣骑士才 ...
- $Hdu1381\ Crazy\ Search$
前置芝士 :string 的 基本用法 string s = "hello world" ; string tmp(s,0,5) ; cout << tmp <& ...
- C语言小项目-基于TCP协议和SOCKET编程的网络通信系统
1.1 功能结构图 网络通信系统一共由4个模块组成,分别是点对点客户端.点对点服务端.服务器中转服务端.服务器中转客户端.这4个模块是成对使用的,点对点客户端和点对点服务端一起使用,服务器中转服务 ...
- hdu2031
http://acm.hdu.edu.cn/showproblem.php?pid=2031 #include<stdio.h> #include<math.h> #inclu ...
- Linux环境下修改MySQL数据库对表名大小写不敏感
Linux系统中MySQL对数据库名称和表名是大小写敏感的,这就导致了一些麻烦,虽然已经建立了表和数据,但因为大小写导致无法找到表. MySQL数据库对表名大小写不敏感的设置方法如下: 1.查看MyS ...
- 373 Find K Pairs with Smallest Sums 查找和最小的K对数字
给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k.定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2.找到和最小的 k 对数字 (u1,v1 ...
- 安卓TV盒子常见问题以及解决方法
1.为什么requestfocus无效 原因:requestfocus不支持在Touch模式下的Focus; 解法方案:再加一个requestFocusFromTouch函数. 2.摄像头打开问题,调 ...