hdu 2686 Matrix【费用流】
来源:互联网 发布:魔秀壁纸软件 编辑:程序博客网 时间:2024/05/16 17:02
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686
代码:
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;const int MAXN = 1010;const int MAXM = 10010;const int INF = 0x3f3f3f3f;struct Edge{ int to,next,cap,flow,cost;}edge[MAXM];int head[MAXN],tol;int pre[MAXN],dis[MAXN];bool vis[MAXN];int N;void init(int n){ N = n; tol = 0; memset(head,-1,sizeof(head));}void addedge(int u,int v,int cap,int cost){ edge[tol].to = v; edge[tol].cap = cap; edge[tol].cost = cost; edge[tol].flow = 0; edge[tol].next = head[u]; head[u] = tol++; edge[tol].to = u; edge[tol].cap = 0; edge[tol].cost = -cost; edge[tol].flow = 0; edge[tol].next = head[v]; head[v] = tol++;}bool spfa(int s,int t){ queue<int>q; for(int i = 0;i < N;i++) { dis[i] = INF; vis[i] = false; pre[i] = -1; } dis[s] = 0; vis[s] = true; q.push(s); while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = false; for(int i = head[u];i != -1;i = edge[i].next) { int v = edge[i].to; if(edge[i].cap > edge[i].flow && dis[v] > dis[u] +edge[i].cost) { dis[v] = dis[u] + edge[i].cost; pre[v] = i; if(!vis[v]) { vis[v] = true; q.push(v); } } } } if(pre[t] == -1)return false; else return true;}int minCostMaxflow(int s,int t,int &cost){ int flow = 0; cost = 0; while(spfa(s,t)) { int Min = INF; for(int i = pre[t];i != -1 ;i = pre[edge[i^1].to]) { if(Min > edge[i].cap - edge[i].flow) Min = edge[i].cap - edge[i].flow; } for(int i = pre[t];i != -1;i = pre[edge[i^1].to]) { edge[i].flow += Min; edge[i^1].flow -= Min; cost += edge[i].cost*Min; } flow += Min; } return flow;}int n;int a[100][100];bool is_ok(int x,int y){ if (x>=1 && x <= n&& y>=1 && y <= n) return true; return false;}int main(){ while (scanf("%d",&n)!=EOF) { init(n*n*2+2); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&a[i][j]); addedge((i-1)*n +j,(i-1)*n+j+n*n,1,-a[i][j]); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if (is_ok(i+1,j)) { addedge((i-1)*n + j+n*n,i*n +j,1,0); } if (is_ok(i,j+1)) { addedge((i-1)*n + j+n*n,(i-1)*n +j+1,1,0); } } addedge(0,1+n*n,2,0); addedge(n*n,n*n*2+1,2,0); int ans; int tmp = minCostMaxflow(0,n*n*2+1,ans); ans = -ans; ans+=a[1][1] + a[n][n]; printf("%d\n",ans); } return 0;}
0 0
- HDU 2686 Matrix | 费用流
- HDU 2686 Matrix(费用流)
- HDU 2686 Matrix 费用流
- hdu 2686 Matrix【费用流】
- HDU 2686 Matrix(费用流)
- hdu 2686 Matrix hdu 3376 Matrix Again 费用流
- HDU 2686 Matrix HDU 3376 Matrix Again 费用流
- hdu 2686 Matrix 最小费用最大流
- hdu 2686 Matrix(最大费用流)
- hdu 2686 Matrix 最大费用最大流
- hdu 2686 Matrix【最大费用流】
- HDU 2686 Matrix(最大费用流)
- Matrix (hdu 2686 最大费用最大流)
- HDU 2686 Matrix 最小费用最大流
- hdu 2686 Matrix【费用流Max_Cost_Max_flow】
- HDU 2686 Matrix 3376 Matrix Again(费用流)
- hdu 2686 Matrix / 3376 Matrix Again最大费用流
- hdu 2686/hdu 3376 Matrix Again 费用流模板
- Restore IP Addresses
- 在java中实现access数据库的远程访问
- struts2学习04——数据封装核心机制
- Hibernate 学习入门2
- android特效引导页面的实现
- hdu 2686 Matrix【费用流】
- Android实现ViewPager自动轮播
- hadoop(2.x)以hadoop2.2为例完全分布式最新高可靠安装文档
- centos7下安装lnmp环境
- 证券的交易价格相对于上一个交易日收盘价格的涨跌幅度不得超过10%
- Ubuntu下源码编译CodeBlocks
- IOS中简单的KVC概念理解与应用
- 什么叫Oracle Parallel模式
- 关于std::function 相关绑定的未解决的问题。