hdu 3376 : Matrix Again【MCMF】
题意:给定一个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】的更多相关文章
- HDU 5948 Thickest Burger 【模拟】 (2016ACM/ICPC亚洲区沈阳站)
Thickest Burger Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- HDU 5938 Four Operations 【贪心】(2016年中国大学生程序设计竞赛(杭州))
Four Operations Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- HDU 5920 Ugly Problem 【模拟】 (2016中国大学生程序设计竞赛(长春))
Ugly Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- 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 ...
- HDU 3916 Sequence Decomposition 【贪心】
这道题目的题意就是使用题目中所给的Gate 函数,模拟出输入的结果 当然我们分析的时候可以倒着来,就是拿输入去减 每次Gate 函数都会有一个有效范围 这道题目求的就是,找出一种模拟方法,使得最小的有 ...
- HDU 4364——Matrix operation——————【模拟题】
Matrix operation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU更多的学校比赛9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学技巧】
困难,.,真,,,不是太困难 的问题是,有一个矩阵运算优化 您有权发言权N*K矩阵A给K*N矩阵B(1<=N<=1000 && 1=<K<=6).他们拿起了第一 ...
- HDU多校赛第9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学小知识】
难度上.,,确实...不算难 问题是有个矩阵运算的优化 题目是说给个N*K的矩阵A给个K*N的矩阵B(1<=N<=1000 && 1=<K<=6),先把他们乘起 ...
- HDU 4661 Message Passing 【Tree】
题意: 给一棵树,每一个结点都有一个信息,每一个时刻,某一对相邻的结点之间可以传递信息,那么存在一个最少的时间,使得所有的节点都可以拥有所有的信息.但是,题目不是求最短时间,而是求最短时间的情况下,有 ...
随机推荐
- golang init方法和main方法初始化顺序
init()和main()方法是golang默认的两个方法,不需要我们调用,程序执行会自动寻找项目中的这俩方法.现在我们就讲一种通用的情况:main 包下 导入了 init2 包而在init2 包下又 ...
- 【HANA系列】SAP HANA行列转换
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA行列转换 前 ...
- 【生成树趣题】CF723F st-Spanning Tree
题目传送门 题意: 给定一个n个点m条边的无向联通图,没有重边和自环.给定s和t,求一棵生成树,使得s,t的度数不超过ds,dt.若有解,输出“Yes”和方案(多组方案输出任意一组),若无解,输出“N ...
- mac搭建apace和php开发环境
启动Apache 1 先介绍几个命令 // 启动Apache服务 sudo apachectl start // 重启Apache服务 sudo apachectl restart // 停止Ap ...
- for循环练习题:拆解字符并输入下标
test = input('请输入:') for item in range(0,len(test)): print(item,test[item])
- 再谈PG索引-存储架构
1.索引的基本架构 PG的索引是B+树,B+树是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接: meta ...
- Oracle 单实例安装篇
linux中启动网卡报错:Error: Connection activation failed: Connection 'eth0' is not available on the device e ...
- [BZOJ 1535] [Luogu 3426]SZA-Template (KMP+fail树+双向链表)
[BZOJ 1535] [Luogu 3426]SZA-Template (KMP+fail树+双向链表) 题面 Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段 ...
- LOCATE()和FIND_IN_SET()
locate(substr,str) 查找substr在str中第一次出现的位置,为空时返回0 SELECT login_name, LOCATE('ning',login_name) FROM us ...
- vi命令(待更新)
第一部分: 0:光标到本行行首$:光标到本行行尾 ^:本行第一个非blank的位置g_:本行最后一个非blank的位置 a:光标后插入(insert是光标前插入字符)o:当前行后加入新行O:当前行钱加 ...