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
原创粉丝点击