线性规划与网络流24题の18 分配问题(最小费用最大流、最大费用最大流)
2014-08-25 14:32
453 查看
这道题也是分别求最小费用最大流和最大费用最大流。
http://wikioi.com/problem/1915/
和运输问题一样。
http://wikioi.com/problem/1915/
和运输问题一样。
//#pragma comment(linker,"/STACK:1024000000,1024000000") #include <map> #include <set> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <string> #include <vector> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef double DB; typedef long long ll; typedef pair<int, int> PII; #define pb push_back #define MP make_pair #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 const DB eps = 1e-6; const int inf = ~0U>>1; const ll INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1000000007; const int maxn = 1000 + 10; /*mincost 为最小费用。若要求最大费用,加边时将费用取反,最后-mincost是最大费用*/ ///先调用init,然后while(Find()); const int maxv = 1000 + 10;///顶点数 const int maxe = 1000000 + 10;///边数 struct node{ int v, w, cap, next; ///cap = 容量, w = 费用 }edge[maxe]; struct fnode{ int e, cap, w;///上一条边,容量,费用 }fn[maxv]; int head[maxv], cnt, st, ed, maxflow, mincost; bool vis[maxv]; void addedge(int u, int v, int cap, int w){ edge[cnt].v = v; edge[cnt].w = w; edge[cnt].cap = cap; edge[cnt].next = head[u]; head[u] = cnt++; edge[cnt].v = u; edge[cnt].w = -w; edge[cnt].cap = 0; edge[cnt].next = head[v]; head[v] = cnt++; // printf("u:%d, v:%d, cap:%d, w:%d, cnt:%d\n", u, v, cap, w, cnt - 1); } bool Find(){///找最短路 memset(vis, false, sizeof(vis)); for(int i=st; i<=ed; i++) fn[i].w = inf; fn[st].w = 0; vis[st] = 1; fn[st].cap = inf; queue<int> Q; Q.push(st); while(!Q.empty()){ int now = Q.front(); Q.pop(); vis[now] = 0; for(int i=head[now]; ~i; i=edge[i].next){ int k = edge[i].v; if(edge[i].cap && fn[now].w + edge[i].w < fn[k].w){ fn[k].w = fn[now].w + edge[i].w; fn[k].cap = min(fn[now].cap, edge[i].cap); fn[k].e = i; if(!vis[k]){ vis[k] = 1; Q.push(k); } } } } if(fn[ed].w == inf) return 0; mincost += fn[ed].cap * fn[ed].w; maxflow += fn[ed].cap; int i = ed; while(i != st){ edge[fn[i].e].cap -= fn[ed].cap; edge[fn[i].e ^ 1].cap += fn[ed].cap; i = edge[fn[i].e ^ 1].v; } return 1; } void init(int source, int sink){ memset(head, -1, sizeof(head)); cnt = 0; st = source; ed = sink;///源点和汇点 maxflow = mincost = 0;///最大流和最小费用 } int n, c[maxn][maxn]; int main(){ scanf("%d", &n); init(0, 2 * n + 1); for(int i=1; i<=n; i++){ addedge(st, i, 1, 0); addedge(i + n, ed, 1, 0); } for(int i=1; i<=n; i++) for(int j=1; j<=n; j++){ scanf("%d", &c[i][j]); addedge(i, j + n, inf, c[i][j]); } while(Find()); printf("%d\n", mincost); init(0, n + n + 1); for(int i=1; i<=n; i++){ addedge(st, i, 1, 0); addedge(i + n, ed, 1, 0); } for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) addedge(i, j + n, inf, -c[i][j]); while(Find()); printf("%d\n", -mincost); return 0; }
相关文章推荐
- 线性规划与网络流24题の17 运输问题(最小费用最大流、最大费用最大流)
- 线性规划与网络流24题之分配问题 最大费用最大流、最小费用最大流、二分图的最佳匹配
- [网络流24题] 18 分配问题(二分图最佳匹配,最小费用最大流)
- 线性规划与网络流24题之最长k可重区间集问题 最大权不相交路径(最大费用最大流)
- 洛谷 P4014 分配问题 【最小费用最大流+最大费用最大流】
- 网络流24题(11)航空路线问题(最大费用最大流)
- 线性规划与网络流24题の24 骑士共存问题 (二分图最大独立集)
- 线性规划与网络流24题之海底机器人问题 最大费用最大流
- luogu4015: 运输问题(网络流/最小费用最大流/最大费用最大流)
- 线性规划与网络流24题の19 负载平衡问题(最小费用最大流)
- 网络流24题18. 分配问题
- 【网络流24题】分配问题 最小最大费用最大流
- 线性规划与网络流24题の1 飞行员配对方案问题(最大匹配)
- 740. [网络流24题] 分配问题 费用流/求最大最小费用
- 线性规划与网络流24题の9 方格取数(二分图点权最大独立集)
- 线性规划与网络流24题之餐巾计划问题 最小费用最大流
- 线性规划于网络流24题之负载平衡问题 最小费用最大流
- 线性规划与网络流24题 03最小路径覆盖问题
- 线性规划以网络流24题の10 餐巾计划问题(费用流)
- 网络流24题(10)餐巾计划问题(最小费用最大流)