【BZOJ 1877】【SDOI 2009】晨跑
2016-04-04 11:26
218 查看
拆点跑$MCMF最小费用最大流$
复习一下$MCMF$模板啦啦啦~~~
一些坑:更新$dist$后要接着更新$pre$,不要判断是否在队列中再更新,,,听不懂吧,听不懂就对了,因为只有我才会在这种错误上犯逗$TwT$
hhh
复习一下$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
相关文章推荐
- nginx反向代理substitutions4nginx模块实现替换字符盗站 nginx.conf配置
- 修改商品详细页-销售记录-买家名称和显示字数
- 在项目中使用mybatis
- Java数据库连接——JDBC调用存储过程,事务管理和高级应用
- 4月3日腾讯笔试题“最长回文子串”PS
- 5、Mysql普通索引创建实例
- MySQL 查询最大最小值优化
- Linux 学习_mysql
- javaServlet+tomcat+mysql简单登陆注册web测试环境搭建
- 学习笔记之lvm基本应用及其扩展和缩减实现
- 学习笔记之lvm基本应用及其扩展和缩减实现
- JSON
- python:比较全面的常用正则表达式
- JS DOM编程艺术学习笔记(三)
- 数据结构——不相交集
- C# mvc--ORM框架中EF的作用和特点
- 《机电传动控制》第六周作业
- 微信公众号API返回不可打印字符的处理。
- 事件独立性
- 获得Class对象的两种方式比较