题目链接:

pid=2686">http://acm.hdu.edu.cn/showproblem.php?pid=2686

和POJ3422一样

删掉K把汇点与源点的容量改为2(由于有两个方向的选择)就可以

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
const int maxn = 20000;
const int maxm = 800000;
const int inf = 1e8;
const int INF = 0x3f3f3f3f;
#define MIN INT_MIN
#define MAX 1e6
#define LL long long
#define init(a) memset(a,0,sizeof(a))
#define FOR(i,a,b) for(int i = a;i<b;i++)
#define max(a,b) (a>b)?(a):(b)
#define min(a,b) (a>b)?(b):(a)
using namespace std;
struct node
{
int u,v,w,cap,next;
} edge[maxm];
int pre[maxn],dis[maxn],head[maxn],cnt;
bool vis[maxn];
int n;
void add(int u,int v,int c,int cap)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=c;
edge[cnt].cap=cap;
edge[cnt].next=head[u];
head[u]=cnt++; edge[cnt].u=v;
edge[cnt].v=u;
edge[cnt].w=-c;
edge[cnt].cap=0;
edge[cnt].next=head[v];
head[v]=cnt++;
}
int spfa(int s,int t)
{
queue<int>q;
while(q.empty()==false) q.pop();
q.push(s);
memset(vis,0,sizeof(vis));
memset(pre,-1,sizeof(pre));
FOR(i,s,t+1)
dis[i] = -1;//求最长路dis数组初始化为-1 dis[s]=0;
vis[s] = 1;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u] = 0;
for(int i=head[u]; i!=-1; i=edge[i].next)
{
if(edge[i].cap && dis[edge[i].v] < (dis[u]+edge[i].w))//求最长路
{
dis[edge[i].v] = dis[u]+edge[i].w;
pre[edge[i].v] = i;
if(!vis[edge[i].v])
{
vis[edge[i].v]=1;
q.push(edge[i].v);
}
}
} }
if(dis[t] != -1)//------------------忘改了。 。 return 1;
else
return 0;
}
int MinCostMaxFlow(int s,int t)
{
int flow=0,cost=0;
while(spfa(s,t))
{
int df = inf;
for(int i = pre[t]; i!=-1; i=pre[edge[i].u])
{
if(edge[i].cap<df)
df = edge[i].cap;
}
flow += df;
for(int i=pre[t]; i!=-1; i=pre[edge[i].u])
{
edge[i].cap -= df;
edge[i^1].cap += df;
}
//printf("df = %d\n",df);
cost += dis[t] * df;
}
return cost;
}
void initt()
{
cnt=0;
memset(head,-1,sizeof(head));
} int ma;
int main()
{
int s,t,k;
while(~scanf("%d",&n))
{
initt();
s = 0;
t=2*n*n+1;
add(s,1,0,2);
int num = n*n;
FOR(i,1,n+1)
{
FOR(j,1,n+1)
{
scanf("%d",&ma);
add((i-1)*n+j,(i-1)*n+j+num,ma,1);
add((i-1)*n+j,(i-1)*n+j+num,0,1);//本点与拆点连线,费用0。容量为无穷 if(i<=n-1)//向下建图
{
add((i-1)*n+j+num,i*n+j,0,1);
}
if(j<=n-1)//向右建图
{
add((i-1)*n+j+num,(i-1)*n+j+1,0,1);
}
}
}
add(t-1,t,0,2); int ans = MinCostMaxFlow(s,t);
printf("%d\n",ans);
}
return 0;
}

HDU 2686 Matrix(最大费用最大流+拆点)的更多相关文章

  1. hdu 2686 Matrix 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the n*n ...

  2. HDU 2686 Matrix(最大费用流)

    Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. HDU 2686 Matrix 3376 Matrix Again(费用流)

    HDU 2686 Matrix 题目链接 3376 Matrix Again 题目链接 题意:这两题是一样的,仅仅是数据范围不一样,都是一个矩阵,从左上角走到右下角在从右下角走到左上角能得到最大价值 ...

  4. hdu 4494 Teamwork 最小费用最大流

    Teamwork Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4494 ...

  5. hdu 2686 Matrix && hdu 3367 Matrix Again (最大费用最大流)

    Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  6. BZOJ-1070 修车 最小费用最大流+拆点+略坑建图

    1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...

  7. UVA-11613 Acme Corporation (最大费用最大流+拆点)

    题目大意:有一种商品X,其每每单位存放一个月的代价I固定.并且已知其每月的最大生产量.生产每单位的的代价.最大销售量和销售单价,还已知每个月生产的X能最多能存放的时间(以月为单位).问只考虑前m个月, ...

  8. UVa 1658 - Admiral(最小费用最大流 + 拆点)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. Going Home HDU - 1533(最大费用最小流)

    On a grid map there are n little men and n houses. In each unit time, every little man can move one ...

随机推荐

  1. NHibernate之旅(14):探索NHibernate中使用视图

    本节内容 引入 1.持久化类 2.映射文件 3.測试 结语 引入 在数据库操作中,我们除了对表操作,还有视图.存储过程等操作,这一篇和下篇来学习这些内容.这篇我们来学习怎样在NHibernate中使用 ...

  2. oracle实现查询每个部门的员工工资排在前三的员工的基本信息具体举例

    --先删除原先存在的表: drop table emp; --创建表emp create table emp ( deptno number, ename varchar2(20), sal numb ...

  3. 读配置文件能够保持顺序的 Java Properties 类

    序 前几天,公司项目中有一个需求是读取配置文件的.并且最好可以保证载入到内存中的顺序可以和配置文件里的顺序一致,可是.假设使用 jdk 中提供的 Properties 类的话,读取配置文件后.载入到内 ...

  4. 门面模式(Facade)

    一:定义 提供一个统一的接口代表子系统内部的一组接口.门面模式提供一个高层的接口,使得子系统更易于使用.   二:经验 2.1 window系统的软关机(不是直接断电)是一个过程, 它自己背后会做很多 ...

  5. [yueqian_scut]Android多点触控技术和应用框架

    Android多点触控技术跟Linux输入子系统紧密相关.本文将从应用的角度说明Android多点触控技术的接口和应用. 一.多点触控场景分析 网络上有关Android多点触控技术的文章多见于两点拉伸 ...

  6. HDOJ 题目3518 Boring counting(后缀数组,求不重叠反复次数最少为2的子串种类数)

    Boring counting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. linux 命令cp拷贝

    linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的.linux下进行复制的命令为cp.假设复制源目录 为 dir1 ,目标目录为dir ...

  8. tomcat开启https服务

    一.创建证书 证书是单点登录认证系统中很重要的一把钥匙,客户端于服务器的交互安全靠的就是证书:本教程由于是演示所以就自己用JDK自带的keytool工具生成证书:如果以后真正在产品环境中使用肯定要去证 ...

  9. 原生javascript实现文件异步上传

    效果图: 代码:(demo33.jsp) <%@ page contentType="text/html;charset=UTF-8" language="java ...

  10. (转)Django学习之 第四章:Django模板系统

    前面的章节我们看到如何在视图中返回HTML,但是HTML是硬编码在Python代码中的 这会导致几个问题: 1.显然,任何页面的改动会牵扯到Python代码的改动 网站的设计改动会比Python代码改 ...