拆点跑$MCMF最小费用最大流$

复习一下$MCMF$模板啦啦啦~~~

一些坑:更新$dist$后要接着更新$pre$,不要判断是否在队列中再更新,,,听不懂吧,听不懂就对了,因为只有我才会在这种错误上犯逗$TwT$

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 205
#define M 20005
#define mo 410
#define read(x) x=getint()
using namespace std;
inline int getint() {int k = 0, fh = 1; char c = getchar(); for(; c < '0' || c > '9'; c = getchar()) if (c == '-') fh = -1; for(; c >= '0' && c <= '9'; c = getchar()) k = k * 10 + c - '0'; return k * fh;}
struct node {
int nxt, to, c, cost;
} E[(N << 1) + (M << 1)];
bool vis[mo];
int point[mo], pre[mo], n, m, cnt = 1, q[mo], dist[mo];
inline void ins(int x, int y, int z, int c) {
E[++cnt].nxt = point[x]; E[cnt].to = y; E[cnt].c = z; E[cnt].cost = c; point[x] = cnt;
E[++cnt].nxt = point[y]; E[cnt].to = x; E[cnt].c = 0; E[cnt].cost = -c; point[y] = cnt;
}
inline bool spfa(int s, int t) {
for(int i = 1; i <= ((n - 1) << 1); ++i)
dist[i] = 0x7fffffff;
int head = 0, tail = 1;
q[1] = s; vis[s] = 1; dist[s] = 0;
while (head != tail) {
++head; if (head == mo) head = 0;
int u = q[head];
vis[u] = 0;
for(int tmp = point[u]; tmp; tmp = E[tmp].nxt)
if (E[tmp].c > 0) {
int v = E[tmp].to;
if (dist[u] + E[tmp].cost < dist[v]) {
dist[v] = dist[u] + E[tmp].cost;
pre[v] = tmp;
if (!vis[v]) {
++tail; if (tail == mo) tail = 0;
q[tail] = v;
vis[v] = 1;
}
}
}
}
return dist[t] != 0x7fffffff;
}
inline void MCMF(int s, int t) {
int a1 = 0, a2 = 0, flow, now;
while (spfa(s, t)) {
++a1;
flow = 0x7fffffff;
for(now = pre[t]; now; now = pre[E[now ^ 1].to])
flow = min(flow, E[now].c);
for(now = pre[t]; now; now = pre[E[now ^ 1].to])
a2 += E[now].cost * flow, E[now].c -= flow, E[now ^ 1].c += flow;
}
printf("%d %d\n", a1, a2);
}
int main() {
read(n); read(m);
for(int i = 2; i < n; ++i)
ins((i << 1) - 1, i << 1, 1, 0);
int u, v, e;
for(int i = 1; i <= m; ++i) {
read(u); read(v); read(e);
if (u == 1)
if (v == n) ins(1, 2, 1, e);
else ins(1, (v << 1) - 1, 1, e);
else if (v == n)
ins(u << 1, 2, 1, e);
else
ins(u << 1, (v << 1) - 1, 1, e);
}
MCMF(1, 2);
return 0;
}

hhh

【BZOJ 1877】【SDOI 2009】晨跑的更多相关文章

  1. 【BZOJ 1877】 [SDOI2009]晨跑

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

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

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

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

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

  4. [SDOI 2009] 晨跑

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1877 [算法] 不难看出,第一问要求的是最大流,第二问求的是最小费用最大流 注意建图 ...

  5. [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)

    [BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...

  6. [BZOJ 1875] [SDOI 2009] HH去散步【矩阵乘法】

    题目链接:BZOJ - 1875 题目分析: 这道题如果去掉“不会立刻沿着刚刚走来的路走回”的限制,直接用邻接矩阵跑矩阵乘法就可以了.然而现在加了这个限制,建图的方式就要做一些改变.如果我们把每一条边 ...

  7. BZOJ 1878 SDOI 2009 HH项链 树状数组 + 脱机处理

    标题效果:一些珠子项链.珠具有不同的颜色.我们问了很多次有多少种不同的颜色有过一段范围. 思考:这个问题让我学会聪明的离线实践.按左端点排序问题.加工出来的位置每种颜色首次出现.每一种颜色的下一次出现 ...

  8. [bzoj 2768]&[bzoj 1877]

    传送门1 传送门1 Solution 两道比较裸的题... 复习一下最大流和费用流的模板. Code[bzoj 2768][JLOI 2010] 冠军调查 #include<bits/stdc+ ...

  9. 【BZOJ】【1877】【SDOI2009】晨跑

    网络流/费用流 费用流入门题……根本就是模板题好吗! 拆点搞定度数限制,也就是每个点最多经过一次……源点汇点除外. /***************************************** ...

  10. BZOJ 3438 小M的作物 & BZOJ 1877 [SDOI2009]晨跑

    我由衷地为我的朋友高兴.哈哈,yian,当你nick name破百上千时,再打“蒟蒻”就会被打的. 好的,说正事吧.请注意,这还是题解.但我发现,网络流实在是太套路了(怪不得这两年几乎销声匿迹).我们 ...

随机推荐

  1. switch结构的用法

    已知学生的名字和百分制分数.要求根据学生的百分制分数,分别采用"满分","优秀","良好","及格"和"不及格 ...

  2. FMS 客户端带宽计算、带宽限制

    FMS 客户端带宽计算.带宽限制 1. 带宽计算 FMS内置了带宽检测的特性(被称作"native bandwidth detection"),要进行带宽检测,客户端只要在成功连接 ...

  3. NOIP2015 运输计划(bzoj4326)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 886  Solved: 574[Submit][Status] ...

  4. Zygote进程【2】——Zygote的分裂

    在Zygote的诞生一文中init进程是如何一步步创建Zygote进程的,也了解了Zygote的进程的作用.Zygote进程的诞生对于整个Java世界可以说有着"开天辟地"的作用, ...

  5. javascript时间的一些问题

    1.求当前时间. var curDate = new Date(); 2.求当前时间的前一天 var preDate = new Date(curDate.getTime()-24*60*60*100 ...

  6. sql server 修改表结构语法大全

    1.增加字段 ) 2.删除字段 alter table table_name drop column column_name 3.修改字段类型 alter table table_name alter ...

  7. Oracle取TOP N条记录(转载)

    在SQL Server里面有top关键字可以很方便的取出前N条记录,但是Oracle里面却没有top的使用,类似实现取出前N条记录的简单方法如下: 方法1:利用ROW_NUMBER函数 取出前5条记录 ...

  8. PhpExcel中文帮助手册|PhpExcel使用方法

    下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...

  9. @OBJC 和 DYNAMIC

    原文转载自:@OBJC 和 DYNAMIC 虽然说 Swift 语言的初衷是希望能摆脱 Objective-C 的沉重的历史包袱和约束,但是不可否认的是经过了二十多年的洗礼,Cocoa 框架早就烙上了 ...

  10. Visual Studio 2013编辑HTML文件无设计视图的解决方案

    在Visual Studio 2013中编辑HTML文件,会发现没有设计视图. 解决方法:点击Visual Studio 2013的”工具“菜单,再点击”选项“—>文本编辑器—>文件扩展名 ...