[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]晨跑[最小费用最大流]的更多相关文章
- BZOJ 1877: [SDOI2009]晨跑( 最小费用最大流 )
		
裸的费用流...拆点, 流量限制为1, 最后的流量和费用即答案. ------------------------------------------------------------------- ...
 - 【BZOJ1877】[SDOI2009]晨跑 最小费用最大流
		
[BZOJ1877][SDOI2009]晨跑 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现 ...
 - BZOJ-1877     晨跑       最小费用最大流+拆点
		
其实我是不想做这种水题的QWQ,没办法,剧情需要 1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1704 Solve ...
 - BZOJ_1877_[SDOI2009]晨跑_费用流
		
BZOJ_1877_[SDOI2009]晨跑_费用流 题意: Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出 ...
 - 1877. [SDOI2009]晨跑【费用流】
		
Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个 ...
 - 【BZOJ 1877】 [SDOI2009]晨跑(费用流)
		
题目描述 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街 ...
 - BZOJ1877 [SDOI2009]晨跑   【费用流】
		
题目 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街道 ...
 - BZOJ 1877: [SDOI2009]晨跑(费用流)
		
看到要求两个量就下意识的想到了费用流= =,先把一个点拆成两个点就能够解决一个的只经过一次的限制 CODE: #include<cstdio>#include<iostream> ...
 - BZOJ 1877:[SDOI2009]晨跑(最小费用最大流)
		
晨跑DescriptionElaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个 ...
 
随机推荐
- Luogu P1330 封锁阳光大学 (黑白染色)
			
题意: 无向图,给一个顶点染色可以让他相邻的路不能通过,但是相邻顶点不能染色,求是否可以让所有的路不通,如果可以求最小染色数. 思路: 对于无向图中的每一个连通子图,都只有两种染色方法,或者染不了,直 ...
 - Go语言实现:【剑指offer】二叉搜索树的第k个的结点
			
该题目来源于牛客网<剑指offer>专题. 给定一棵二叉搜索树,请找出其中的第k小的结点.例如,(5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. Go语言实现: ...
 - Go语言实现:【剑指offer】树的子结构
			
该题目来源于牛客网<剑指offer>专题. 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) Go语言实现: type TreeNode stru ...
 - 《C语言》—— 数组详解
			
书籍使我变成了一个幸福的人,使我的生活变成轻松而舒适的诗.--高尔基 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tec ...
 - 低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
			
什么是蓝牙service和characteristic?到底怎么理解蓝牙profile?ATT和GATT两者如何区分?什么又是attribute?attribute和characteristic的区别 ...
 - c#设计模式读书博客
			
第一次在博客园撸博客,也是为了鞭策自己去学习进步,过年之后买了一本<C#设计模式>这是我一直很想去学习的一本书.然后用博客记录我的学习历程,并且分享给需要的人.这本书记录的设计模式有23种 ...
 - Source Code Structure - Python 源码目录结构
			
Source Code Structure - Python 源码目录结构 Include 目录包含了 Python 提供的所有头文件, 如果用户需要用 C 或 C++ 编写自定义模块扩展 Pytho ...
 - qt creator源码全方面分析(2-8)
			
目录 Editing MIME Types Editing MIME Types Qt Creator使用文件的MIME类型,来确定用于打开文件的模式和编辑器. 例如,Qt Creator在C++编辑 ...
 - mysql5.5编译安装
			
MySQL是一个关系型数据库管理系统 ,由瑞典MySQL AB公司开发,目前属于Oracle 公司.MySQL分为社区版和商业版,由于其体积小.速度快.总体拥有成本低,尤其是开放源码 这一特点,一般中 ...
 - Git简易教程(常用命令)
			
本文章参考了Pro Git 1 Git简介 Linux内核开源项目有着众多参与者,为了提高开发效率,项目组于2002年开始启用分布式版本控制系统BitKeeper来管理和维护代码.在BitKeeper ...