[SDOI2009]晨跑

最小费用最大流的板子题吧

令 \(i'=i+n\)

\(i -> i'\) 建一条流量为1费用为0的边这样就不会对答案有贡献

其次是对 \(m\) 条边建 \(u'->v\) 流量为1费用为cost反向为0费用为-cost (单向边,不管

这样建图就有从必须令 \(1'\)为源点 \(n\) 为汇点

然后每条流的路线都是 \(1' -> u_1 -> u_1' -> u_2 -> u_2' -> ... -> n\)

于是就可以直接MCMF板子……

#include <bits/stdc++.h>
using namespace std ;
using ll = long long ;
using pii = pair < int , int > ;
void read(int & x) {
char c = x = 0 ; bool f = 1 ;
while(c < '0' || c > '9') { if(c == '-') f = 0 ; c = getchar() ; }
while(c >= '0' && c <= '9') { x = (x << 1) + (x << 3) + (c & 15) ; c = getchar() ; }
x = f ? x : -x ;
}
int n , m , s , t ;
const int N = 5e3 + 10 ;
const int M = 5e4 + 10 ;
namespace MCMF {
void cmax(int & x , int y) { if(x < y) x = y ; }
void cmin(int & x , int y) { if(x > y) x = y ; }
struct Edge { int v , nxt , f , c ; } e[M << 1] ;
int cnt = 1 , head[N] , pre[N] , dis[N] , vis[N] ;
void add(int u , int v , int flow , int cost) {
e[++ cnt] = { v , head[u] , flow , cost } ; head[u] = cnt ;
e[++ cnt] = { u , head[v] , 0 , -cost } ; head[v] = cnt ;
}
bool spfa(int s) {
memset(dis , 0x3f , sizeof(dis)) ;
queue < int > q ; dis[s] = 0 ; q.push(s) ;
while(q.size()) {
int u = q.front() ; q.pop() ; vis[u] = 0 ;
for(int i = head[u] ; i ; i = e[i].nxt) {
int v = e[i].v ;
if(dis[v] > dis[u] + e[i].c && e[i].f) {
dis[v] = dis[u] + e[i].c ; pre[v] = i ;
if(! vis[v]) { vis[v] = 1 ; q.push(v) ; }
}
}
}
return (dis[t] ^ dis[0]) ;
}
int upd(int & maxflow) {
int p = 0 , mn = 1e9 , cost = 0 ;
for(int u = t ; u ^ s ; u = e[p ^ 1].v) cmin(mn , e[p = pre[u]].f) ;
for(int u = t ; u ^ s ; u = e[p ^ 1].v) { e[p = pre[u]].f -= mn ; e[p ^ 1].f += mn ; cost += e[p].c * mn ; }
return maxflow += mn , cost ;
}
void EK(int & maxflow , int & mincost) { while(spfa(s)) mincost += upd(maxflow) ; }
}
using namespace MCMF ;
signed main() {
read(n) ; read(m) ; s = n + 1 ; t = n ;
for(int i = 1 ; i <= m ; i ++) { int u , v , flow = 1 , cost ; read(u) ; read(v) ; read(cost) ; add(u + n , v , flow , cost) ; }
for(int i = 1 ; i <= n ; i ++) { add(i , i + n , 1 , 0) ; }
int maxflow = 0 , mincost = 0 ;
EK(maxflow , mincost) ;
printf("%d %d\n" , maxflow , mincost) ;
return 0 ;
}

[SDOI2009]晨跑[最小费用最大流]的更多相关文章

  1. BZOJ 1877: [SDOI2009]晨跑( 最小费用最大流 )

    裸的费用流...拆点, 流量限制为1, 最后的流量和费用即答案. ------------------------------------------------------------------- ...

  2. 【BZOJ1877】[SDOI2009]晨跑 最小费用最大流

    [BZOJ1877][SDOI2009]晨跑 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现 ...

  3. BZOJ-1877 晨跑 最小费用最大流+拆点

    其实我是不想做这种水题的QWQ,没办法,剧情需要 1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1704 Solve ...

  4. BZOJ_1877_[SDOI2009]晨跑_费用流

    BZOJ_1877_[SDOI2009]晨跑_费用流 题意: Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出 ...

  5. 1877. [SDOI2009]晨跑【费用流】

    Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个 ...

  6. 【BZOJ 1877】 [SDOI2009]晨跑(费用流)

    题目描述 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街 ...

  7. BZOJ1877 [SDOI2009]晨跑 【费用流】

    题目 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街道 ...

  8. BZOJ 1877: [SDOI2009]晨跑(费用流)

    看到要求两个量就下意识的想到了费用流= =,先把一个点拆成两个点就能够解决一个的只经过一次的限制 CODE: #include<cstdio>#include<iostream> ...

  9. BZOJ 1877:[SDOI2009]晨跑(最小费用最大流)

    晨跑DescriptionElaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个 ...

随机推荐

  1. 转载 angularJS filter 过滤器

    angularjs中的filter(过滤器) 标签: angularjsfilter   源文地址:http://www.ncloud.hk/技术分享/angularjs中的filter-过滤器/ f ...

  2. MySql在Windows下自动备份的几种方法

    以下几种全部是批处理命令中对于备份文件 1.复制date文件夹备份============================假想环境:MySQL   安装位置:C:\MySQL论坛数据库名称为:bbs数 ...

  3. 跨域的两种解决方法jsonp和CORS

    1.跨域 什么是跨域? 当你请求的url是不同源的数据的时候,浏览器一般会抛出请求跨域的错误,如下图: 造成跨域的原因? 即你违反了浏览器的同源策略的限制=>阻止一个域的js脚本和另外一个域的内 ...

  4. kubernetes集合

    kubernetes集合 kubernetes(1):kubernetes简介和组件 kubernetes(2):yum安装kubernetes kubernetes(3):kubeadm安装k8s1 ...

  5. docker:搭建ELK 开源日志分析系统

    ELK 是由三部分组成的一套日志分析系统, Elasticsearch: 基于json分析搜索引擎,Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片 ...

  6. 动态获取bind dns日志IP脚本

    #!/usr/bin/env python #_*_coding:utf-8_*_ ''' python deny_dns_allip.py your_filelog_name 动态获取dns日志的I ...

  7. js能力测评——查找元素的位置

    查找元素的位置 题目描述: 找出元素 item 在给定数组 arr 中的位置 输出描述: 如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1 示例1 输入 [ 1, 2, 3, 4 ] ...

  8. 安卓接入融云IM连接不上??

    融云初始化失败?融云连接失败??连接回调方法不执行???不可能的,就那么几行代码,怎么会有错. 1.项目gradle里添加融云maven仓库 maven {url "https://dl.b ...

  9. Android中ProgressBar的使用-通过Handler与Message实现进度条显示

    场景 进度条效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为 ...

  10. Git 学习文档

    Study Document for Git Git 基础 Git 文件的三种状态: 已提交(committed).已修改(modified)和已暂存(staged). Git 工作目录的状态: 已跟 ...