题目链接

题意:给定一个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. Java Stream流排序null以及获取指定条数数据

    Java8的Stream流的一些用法, //排序 carerVehEntityList = carerVehEntityList.stream().sorted( Comparator.compari ...

  2. 关机报 at-spi-bus-launcher

    查看是否有autostart文件夹,有则不建立 mkdir -v ~/.config/autostart 可直接修改/etc/xdg/autostart/at-spi-dbus-bus.desktop ...

  3. java里null强转为某个类会报错吗?

    1.定义一个User类如下: /** * @author lizhibiao * @date 2018/11/27 17:21 */public class User{ private String ...

  4. Golang的面向对象编程【结构体、方法、继承、接口】

    Golang也支持面向对象编程.但与以前学过传统的面向对象编程语言有区别.1)Golang没有类class,Go语言的结构体struct和类class有相似的特性.2)Golang中不存在继承,方法重 ...

  5. lua基础学习(二)

    一,Lua变量   1.lua变量的三种类型:全局变量,局部变量,表中的域 Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量. 局部变量的作用域为从声明位置 ...

  6. 【Angular5】 返回前一页面 go back to previous page

    import { Component, OnInit } from '@angular/core'; import { Router} from '@angular/router'; import { ...

  7. qt 两种按钮点击事件应用

    1.传统connect 例如: connect(ui->findPushBtn,SIGNAL(clicked()),this,SLOT(find())); 参数1:事件UI 参数2:点击系统函数 ...

  8. Vue 子组件,向父组件传递。

  9. PostGIS 爆管分析之找出上游阀门(优化版)

    说明 前面描述过利用postgis查找上游阀门的原理,以及代码,其实当初写完就发现又很大的优化空间,但一直没有时间去做. 最近遇到一个情况,处理60w+条管网数据时,效率太慢了,于是腾时间优化了一版. ...

  10. 剑指offer-顺时针打印矩阵-数组-python

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...