题目链接

题意:给定一个n*n的矩阵,找一条路,从左上角到右下角再到左上角,每个点最多经过一次,求路径上的点的权值的最大和。

将矩阵中每个点拆点,点容量为1,费用为点权值的相反数。每个点向自己右侧和下侧的点连一条容量为1,费用为0的边。左上角为起点,右下角为终点,对起点终点分别额外加条容量为1,费用为0的边,然后跑最大流最小费用。输出费用的相反数即可。

#include<bits/stdc++.h>
using namespace std; const int N=;
const int M=;
const int INF=0x3f3f3f3f;
struct Edge
{
int to,next;
int c,f,w;
Edge(){}
Edge(int to_,int c_,int f_,int w_,int next_)
{
to=to_,c=c_,f=f_,w=w_,next=next_;
}
}edge[M<<];
int head[N],tot;
bool inq[N];
int d[N],p[N],a[N];
void init()
{
memset(head,-,sizeof(head));
tot=;
}
void addedge(int u,int v,int c,int w)
{
edge[tot]=Edge(v,c,,w,head[u]), head[u]=tot++;
edge[tot]=Edge(u,,,-w,head[v]),head[v]=tot++;
}
bool spfa(int s,int t,int& flow,int& cost)
{
memset(d,INF,sizeof(d));
memset(inq,false,sizeof(inq));
queue<int> Q;
d[s]=,inq[s]=true,a[s]=INF;
Q.push(s);
while(!Q.empty())
{
int u=Q.front();Q.pop();
inq[u]=false;
for(int i=head[u];~i;i=edge[i].next)
{
Edge& e=edge[i]; int v=e.to;
if(e.c>e.f&&d[v]>d[u]+e.w)
{
d[v]=d[u]+e.w,p[v]=i;
a[v]=min(a[u],e.c-e.f);
if(!inq[e.to]) Q.push(e.to),inq[e.to]=true;
}
}
}
if(d[t]==INF) return false;
flow+=a[t],cost+=d[t]*a[t];
for(int u=t;u!=s;u=edge[p[u]^].to)
{
edge[p[u]].f+=a[t];
edge[p[u]^].f-=a[t];
}
return true;
}
void Mincost(int s,int t,int& flow,int& cost)
{
flow=cost=;
while(spfa(s,t,flow,cost));
} //==============================================
int n;
inline int id(int x,int y)
{
return x*n+y;
}
int main()
{
while(~scanf("%d",&n))
{
init();
for(int i=;i<n;i++)
for(int j=;j<n;j++)
{
int temp;
scanf("%d",&temp);
if(i==&&j==||i==n-&&j==n-) addedge(id(i,j),id(i,j)+n*n,,);
addedge(id(i,j),id(i,j)+n*n,,-temp);
if(i<n-) addedge(id(i,j)+n*n,id(i+,j),,);
if(j<n-) addedge(id(i,j)+n*n,id(i,j+),,);
}
int s=id(,),t=id(n-,n-)+n*n;
int flow,cost;
Mincost(s,t,flow,cost);
printf("%d\n",-cost);
}
}

hdu 3376 : Matrix Again【MCMF】的更多相关文章

  1. HDU 5948 Thickest Burger 【模拟】 (2016ACM/ICPC亚洲区沈阳站)

    Thickest Burger Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  2. HDU 5938 Four Operations 【贪心】(2016年中国大学生程序设计竞赛(杭州))

    Four Operations Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  3. HDU 5920 Ugly Problem 【模拟】 (2016中国大学生程序设计竞赛(长春))

    Ugly Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  4. HDU 5873 Football Games 【模拟】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Football Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  5. HDU 3916 Sequence Decomposition 【贪心】

    这道题目的题意就是使用题目中所给的Gate 函数,模拟出输入的结果 当然我们分析的时候可以倒着来,就是拿输入去减 每次Gate 函数都会有一个有效范围 这道题目求的就是,找出一种模拟方法,使得最小的有 ...

  6. HDU 4364——Matrix operation——————【模拟题】

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

  7. HDU更多的学校比赛9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学技巧】

    困难,.,真,,,不是太困难 的问题是,有一个矩阵运算优化 您有权发言权N*K矩阵A给K*N矩阵B(1<=N<=1000 && 1=<K<=6).他们拿起了第一 ...

  8. HDU多校赛第9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学小知识】

    难度上.,,确实...不算难 问题是有个矩阵运算的优化 题目是说给个N*K的矩阵A给个K*N的矩阵B(1<=N<=1000 && 1=<K<=6),先把他们乘起 ...

  9. HDU 4661 Message Passing 【Tree】

    题意: 给一棵树,每一个结点都有一个信息,每一个时刻,某一对相邻的结点之间可以传递信息,那么存在一个最少的时间,使得所有的节点都可以拥有所有的信息.但是,题目不是求最短时间,而是求最短时间的情况下,有 ...

随机推荐

  1. jenkins自动化部署工具

    jenkins自动化测试 & 持续集成 知识点: 1.下载地址:jenkins.io download:

  2. python 并发编程 多线程 Thread对象的其他属性或方法

    介绍 Thread实例对象的方法 # isAlive(): 返回线程是否活动的. # getName(): 返回线程名. # setName(): 设置线程名. threading模块提供的一些方法: ...

  3. [转帖]软件的变革与 AOT

    软件的变革与 AOT https://www.colabug.com/851475.html 文章写的很牛B .. 前言 AOT 即 Ahead of Time Compilation,即运行前编,与 ...

  4. Linux中/etc下面passwd和shadow文件介绍

    1./etc/passwd root@root:~# cat /etc/passwd root:x:::root:/root:/bin/bash daemon:x:::daemon:/usr/sbin ...

  5. 通过node指令自动创建一个package.json文件,并封装发布使用

    通过node指令自动创建一个package.json文件,并封装发布使用:https://blog.csdn.net/scu_cindy/article/details/78208268

  6. 【6.28校内test】T1 Jelly的难题1

    Jelly的难题[题目链接] 废话一句:今天中考出成绩,感觉大家考的都超级棒,不管怎样,愿大家成为最好的自己. 好了废话完了,下面是题解部分: SOLUTION: 首先你可能发生的,是看不懂题: 定睛 ...

  7. 洛谷 P1484 种树 题解

    题面 这是一道标准的带反悔贪心: 利用大根堆来维护最大值: 当选择了num[i]后,反悔了,反之选择选了num[i-1]和num[i+1]时获利便增加了num[i-1]+num[i+1]-num[i] ...

  8. P1142轰炸

    这是uva上的一道模拟题. 首先给出n(n<=700)个点的坐标(坐标在1*10^9)之内,询问走直线可以经过的点数.一开始我想到了一个类似于桶排序的方法来存坐标,但是要注意数组大小啊!第二次想 ...

  9. Linux的用户与用户组(权限管理)

    linux用户与用户.权限管理 用户管理: 1.useradd 创建用户 -c 指定用户描述 -d 指定家目录 默认家目录 /home下同名的目录 -g 指定主组 -G 指定附加组 [注意:一个用户主 ...

  10. 记一次神奇的codeforces

    今天有一场codeforces的div3,时间挺合适,于是就想打.结果发现rating超过1600就不能报名.虽然shzr好久不打CF了而且很菜,但是毕竟还是到了1600的,于是和ZUTTER_一起用 ...