bzoj1070 修车&& bzoj2879美食节 【费用流】
bzoj1070:
把每个工人拆成汽车那么多个点,假如说 工人(i, j) 和 汽车k 连边,那就代表第i个工人倒数第j个修汽车k,那么这条边对以后的贡献就是k*time[i修k]。
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define mp make_pair
#define pb push_back
#define clr(x) memset(x, 0, sizeof(x))
#define xx first
#define yy second
using namespace std;
typedef long long i64;
typedef pair<int, int> pii;
const int inf = ~0U >> ;
const i64 INF = ~0ULL >> ;
//********************************* const int maxn = , maxm = ; struct Ed {
int u, v, nx, c, w; Ed() {}
Ed(int _u, int _v, int _nx, int _c, int _w) :
u(_u), v(_v), nx(_nx), c(_c), w(_w) {}
} E[maxm << ];
int G[maxn], edtot;
void addedge(int u, int v, int c, int w) {
E[edtot] = (Ed){u, v, G[u], c, w};
G[u] = edtot++;
E[edtot] = (Ed){v, u, G[v], , -w};
G[v] = edtot++;
} bool vis[maxn]; int dis[maxn], s, t;
bool spfa() {
static int que[maxm]; int qh(), qt();
rep(i, s, t) vis[i] = , dis[i] = 0x3f3f3f3f;
dis[que[++qt] = s] = ; vis[s] = ;
while (qh != qt) {
int x = que[++qh]; vis[x] = ;
for (int i = G[x]; i != -; i = E[i].nx) {
if (E[i].c && dis[E[i].v] > dis[x] + E[i].w) {
dis[E[i].v] = dis[x] + E[i].w;
if (!vis[E[i].v]) vis[que[++qt] = E[i].v] = ;
}
}
}
return dis[t] != 0x3f3f3f3f;
}
int ans, cur[maxn];
int dfs(int u, int rm) {
vis[u] = ;
if (u == t) return rm;
int rm1 = rm;
for (int &i = cur[u]; i != -; i = E[i].nx) {
if (E[i].c && !vis[E[i].v] && dis[E[i].v] == dis[u] + E[i].w) {
int flow = dfs(E[i].v, min(rm, E[i].c));
E[i].c -= flow, E[i ^ ].c += flow;
ans += flow * E[i].w;
if ((rm -= flow) == ) break;
}
}
if (rm1 == rm) dis[u] = ;
return rm1 - rm;
} int a[][];
int main() {
int m, n; scanf("%d%d", &m, &n);
rep(i, , n) rep(j, , m) scanf("%d", &a[i][j]);
s = , t = n + n * m + ;
memset(G, -, sizeof(G));
rep(i, , n) addedge(s, i, , );
rep(i, n + , n + n * m) addedge(i, t, , );
rep(i, , n) {
rep(j, , m) {
rep(k, , n) {
addedge(i, n + (j - ) * n + k, , k * a[i][j]);
}
}
}
while (spfa()) memcpy(cur, G, sizeof(G)),dfs(s, 0x3f3f3f3f);
printf("%.2lf\n", 1.0 * ans / n);
return ;
}
bzoj2879:
首先把每个食物和厨师连边,一开始只用和每个厨师的倒数第一这个时间段连边,如果用了的话再用这个厨师的倒数第二去连边。
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define pb push_back
#define mp make_pair
#define clr(x) memset(x, 0, sizeof(x))
#define xx first
#define yy second
using namespace std;
typedef long long i64;
typedef pair<int, int> pii;
const int inf = ~0U >> ;
const i64 INF = ~0ULL >> ;
//********************************** const int maxn = , maxm = ; struct Ed {
int u, v, nx, c, w; Ed() {}
Ed(int _u, int _v, int _nx, int _c, int _w) :
u(_u), v(_v), nx(_nx), c(_c), w(_w) {}
} E[maxm];
int G[maxn], edtot = ;
void addedge(int u, int v, int c, int w) {
E[++edtot] = Ed(u, v, G[u], c, w);
G[u] = edtot;
E[++edtot] = Ed(v, u, G[v], , -w);
G[v] = edtot;
} int tot, n, m; bool vis[maxn]; int dis[maxn], s, t, pre[maxn];
bool spfa() {
static int que[maxn]; int qh(), qt();
rep(i, s, t) vis[i] = , dis[i] = inf;
vis[que[++qt] = s] = , dis[s] = ;
while (qh != qt) {
int x = que[++qh]; if (qh == t) qh = ;
for (int i = G[x]; i; i = E[i].nx) {
if (E[i].c && dis[E[i].v] > dis[x] + E[i].w) {
dis[E[i].v] = dis[x] + E[i].w;
pre[E[i].v] = i;
if (!vis[E[i].v]) {
vis[que[++qt] = E[i].v] = ;
if (qt == t) qt = ;
}
}
}
vis[x] = ;
}
return dis[t] != inf;
}
int a[][];
int ans;
void mcf() {
int flow = inf, x, y;
for (int i = pre[t]; i; i = pre[E[i].u]) {
flow = min(flow, E[i].c);
if (E[i].v == t) {
x = (E[i].u - ) / tot + ; y = E[i].u % tot + ;
}
}
for (int i = pre[t]; i; i = pre[E[i].u]) {
E[i].c -= flow, E[i ^ ].c += flow, ans += flow * E[i].w;
}
addedge((x - ) * tot + y, t, , );
for (int i = ; i <= n; i++)
addedge(m * tot + i, (x - ) * tot + y, , y * a[i][x]);
} int main() {
scanf("%d%d", &n, &m);
static int c[];
rep(i, , n) scanf("%d", c + i), tot += c[i];
rep(i, , n) rep(j, , m) scanf("%d", &a[i][j]);
s = , t = m * tot + n + ;
rep(i, , n) addedge(s, m * tot + i, c[i], );
rep(i, , m) addedge((i - ) * tot + , t, , );
rep(i, , m) rep(j, , n) addedge(m * tot + j, (i - ) * tot + , , a[j][i]);
while (spfa()) mcf();
printf("%d\n", ans);
return ;
}
注意,把从食物向厨师连边比较快。
bzoj1070 修车&& bzoj2879美食节 【费用流】的更多相关文章
- [NOI2012][bzoj2879] 美食节 [费用流+动态加边]
题面 传送门 思路 先看看这道题 修车 仔细理解一下,这两道题是不是一样的? 这道题的不同之处 但是有一个区别:本题中每一种车有多个需求,但是这个好办,连边的时候容量涨成$p\lbrack i\rbr ...
- 【bzoj2879】[Noi2012]美食节 费用流+动态加边
原文地址:http://www.cnblogs.com/GXZlegend 题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他 ...
- [NOI2012]美食节(费用流)
题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...
- [NOI2012]美食节——费用流(带权二分图匹配)+动态加边
题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...
- [BZOJ2879][NOI2012]美食节(费用流)
设sm为所有p之和,套路地对每道菜建一个点,将每个厨师拆成sm个点,做的倒数第i道菜的代价为time*i. S向每道菜连边<0,p[i]>(前者为代价后者为流量),i菜到j厨师的第k个点连 ...
- [BZOJ2879] [Noi2012] 美食节 (费用流 & 动态加边)
Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...
- BZOJ.2879.[NOI2012]美食节(费用流SPFA)
题目链接 /* 同"修车":对于每个厨师拆成p个点表示p个时间点,每个人向m个厨师每个时间点连边 这样边数O(nmp)+网络流 ≈O(nm*p^2)(假设SPFA线性) = GG ...
- 【BZOJ 2879】[Noi2012]美食节 费用流
思路同修车,就是多了一个骚气的操作:动态加边,我们通过spfa流的过程可以知道,我们一次只会跑一流量,最后一层边跑过就不会再悔改,所以说我们只会用到一大片里面的很少的点,所以我们如果可以动态加边的话我 ...
- BZOJ 2879: [Noi2012]美食节( 费用流 + 动态加边 )
倒着做菜..然后考虑为当前的人做菜对后面的人的影响就可以了..要动态加边 --------------------------------------------------------------- ...
随机推荐
- 购物车CheckBox全选、反选
注意:不是很完美 //--------------------主布局文件--------------------------------- <LinearLayout xmlns:android ...
- 基础-Ajax,json
ajax是异步交互,也就是说发送请求,到响应回来,页面只是局部刷新. Ajax 步骤: 获取XMLHttpRequest对象 绑定一个回调函数 open send 在回调函数中完成操作. json是一 ...
- HDU1171--Big Event in HDU(多重背包)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 2209 翻纸牌游戏
翻纸牌游戏 Time Limit : 9000/3000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submiss ...
- zencart url特殊字符处理
1. 支持 在后台的seo url 将Outputw3c 改为false 2.删除特殊字符 这对于在少量的zen cart网站上处理少量的特殊字符可能还适用,实际上我们经常在导入产品数据时或者或少会带 ...
- 标准与扩展ACL实验
一标准访问控制列表实验: 实验拓扑: 实验目的:掌握标准与扩展ACL的配置 实验要求:拒绝R1到R3的所有流量 实验步骤: 步骤1 按如上拓扑做好底层配置,并检测相邻设备之间的连通性 步骤2起静态路由 ...
- 扩展欧几里得 POJ 1061
感觉这道题目的数据好水啊...我的代码我都觉得姿势特别奇怪...竟然还过了... 好吧,原来不是姿势奇怪,而是逆元需要用的时候是余数也需要的时候,这里的余数是不需要的,所以就AC了 就说一下碰到的问题 ...
- windows 杀进程软件
pchunter 电脑禁用u盘可用金山卫士开启.注册表
- Quartz 2D 初步
转载自:http://www.cofcool.net/development/2015/06/17/ios-study-note-six-Quartz2D/ Quartz 2D是一个二维绘图引擎,同时 ...
- FZU 2107 Hua Rong Dao(暴力回溯)
dfs暴力回溯,这个代码是我修改以后的,里面的go相当简洁,以前的暴力手打太麻烦,我也来点技术含量.. #include<iostream> #include<cstring> ...