思路:队友贪心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的更多相关文章

  1. 国庆集训 || Wannafly Day1

    网址:https://www.nowcoder.com/acm/contest/201#question A.签到 手速石头剪刀布 #include <cstdio> #include & ...

  2. 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1

    目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...

  3. ACM/ICPC Moscow Prefinal 2019 趣题记录

    ### Day1: ### **Problem C:** 设$k_i​$为$[A, B]​$中二进制第$i​$位是1的数的个数. 给出$k_0 \cdots k_{63}​$, 求出$[A, B]​$ ...

  4. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  5. 2020 wannafly camp 补题 day1

    题目可以从牛客上找到. 最简单的一个题应该是B B. 密码学 这个应该就是倒着推,题目给了你加密的顺序,所以我们逆推这个就可以得到每一次加密前的字符串. 1H. 最大公约数 题目大意就是给你一个范围1 ...

  6. wannafly camp day1

    题目描述: 恬恬的生日临近了.宇扬给她准备了一个大 蛋糕. 正如往常一样,宇扬在蛋糕上插了nnn支蜡烛,并把蛋糕分为mmm个区域.因为某种原因,他必须把第iii根蜡烛插在第aia\_iai​个区域或第 ...

  7. 2020 CCPC Wannafly Winter Camp Day1 Div.1&amp F

    #include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...

  8. 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 ...

  9. 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 ...

  10. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

随机推荐

  1. springboot(一) 热部署

    代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo 1.热部署的定义 所谓的热部署:比如项目的热部署,就是在应用 ...

  2. LOJ#503. 「LibreOJ β Round」ZQC 的课堂(容斥+FHQTreap)

    题面 传送门 题解 首先\(x\)和\(y\)两维互相独立,可以分开考虑,我们以\(x\)为例 我们把\(x\)做个前缀和,那么就是问有多少\(i\)满足\(s_is_{i-1}<0\),其中\ ...

  3. 用 NPOI 组件实现数据导出

    利用 Nuget 安装 NPOI 组件. 所需引用的 dll:ICSharpCode.SharpZipLib.dll.NPOI.dll.NPOI.OOXML.dll.NPOI.OpenXml4Net. ...

  4. 406 Queue Reconstruction by Height 根据身高重建队列

    假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列.注意:总人数少于1100人.示 ...

  5. 对数组名取地址&a和 数组首地址a

    #include <iostream> using namespace std; ] = {,,,,}; int main() { cout<<a<<" ...

  6. error: no such device : 76de62ec-ac60-4c4d-bb Entering rescue mode .. grub resuce>(系统硬盘驱动器MBR已损坏)问题解决办法(图文详解)

    问题详情   近期,由于博主我,担任实验室整个大数据集群的leader,突然的断电给整个集群造成,如下的情况问题.(欲哭无泪,我的各种服务啊) 解决办法 第一种方法:尝试,直接重启机器(我这里是台式机 ...

  7. Hive insert into directory 命令输出的文件没有列分隔符分析和解决

    参考资料:http://stackoverflow.com/questions/16459790/hive-insert-overwrite-directory-command-output-is-n ...

  8. [转]TFS下的源代码控制

    本文转自:http://www.cnblogs.com/ajiefj/archive/2010/04/23/1718450.html 以下主要描述了: TFS源代码控制系统的基本场景 如何把一个项目添 ...

  9. 论tab切换的几种实现方法

    tab切换在网页中很常见,故最近总结了4种实现方法. 首先,写出tab的框架,加上最简单的样式,代码如下: <!DOCTYPE html> <html> <head> ...

  10. STL容器迭代过程中删除元素技巧(转)

    1.连续内存序列容器(vector,string,deque) 序列容器的erase方法返回值是指向紧接在被删除元素之后的元素的有效迭代器,可以根据这个返回值来安全删除元素. vector<in ...