[hdu 3376]Matrix Again
这题就是真正的费用流了,用 大屁 就算不超时,你也有个 CE :数组 so large
拆点,费用取反,最大费用最大流即可了喵~
不过似乎这题很不兼容 dijkstra 的样子
就算用 spfa 重赋权把边权搞正后依然 TLE ,额不是说 dijstra 正权图最强么?
一定是我没有手写堆,一定是的……
#include <cstdio>
#include <cstring>
#include <queue>
#define min(x, y) ((x)<(y) ? (x):(y))
const int inf=0x7F7F7F7F;
const int sizeOfPoint=800008;
const int sizeOfEdge=8000008; int n;
int V;
int S, T;
int a[666][666][2];
bool vis[sizeOfPoint];
int h[sizeOfPoint];
inline int getint();
inline void putint(int); struct edge {int point, flow, cost; edge * next, * pair;};
edge memory[sizeOfEdge], * port=memory;
edge * e[sizeOfPoint];
inline void clear() {port=memory; memset(e, 0, sizeof e); memset(a, 0, sizeof a);}
inline edge * newedge(int point, int flow, int cost, edge * next)
{
edge * ret=port++;
ret->point=point; ret->flow=flow; ret->cost=cost; ret->next=next;
return ret;
}
inline void link(int u, int v, int f, int c)
{
e[u]=newedge(v, f, c, e[u]); e[v]=newedge(u, 0, -c, e[v]);
e[u]->pair=e[v]; e[v]->pair=e[u];
}
inline bool spfa();
int aug(int, int);
inline int costflow(); int main()
{
while (scanf("%d", &n)!=EOF)
{
clear();
V=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
a[i][j][0]=++V; a[i][j][1]=++V;
link(a[i][j][0], a[i][j][1], 1, -getint());
} link(a[1][1][0], a[1][1][1], 1, 0);
link(a[n][n][0], a[n][n][1], 1, 0);
S=1; T=V;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
if (i<n) link(a[i][j][1], a[i+1][j][0], 1, 0);
if (j<n) link(a[i][j][1], a[i][j+1][0], 1, 0);
}
putint(-costflow());
} return 0;
} inline int getint()
{
register int num=0;
register char ch;
do ch=getchar(); while (ch<'0' || ch>'9');
do num=num*10+ch-'0', ch=getchar(); while (ch>='0' && ch<='9');
return num;
}
inline void putint(int num)
{
char stack[15];
register int top=0;
for ( ;num;num/=10) stack[++top]=num%10+'0';
for ( ;top;top--) putchar(stack[top]);
putchar('\n');
} inline bool spfa()
{
static std::queue<int> q;
static bool inque[sizeOfPoint];
memset(h, 0x7F, sizeof h); h[T]=0;
memset(inque, 0, sizeof inque);
for (inque[T]=true, q.push(T);q.size();q.pop())
{
int u=q.front();
inque[u]=false;
for (edge * i=e[u];i;i=i->next) if (i->pair->flow && h[i->point]>h[u]+i->pair->cost)
{
h[i->point]=h[u]+i->pair->cost;
q.push(i->point);
if (!inque[i->point]) inque[i->point]=true, q.push(i->point);
}
}
return h[S]<inf;
}
int aug(int u, int flow)
{
int left=flow;
if (u==T) return flow;
vis[u]=true;
for (edge * i=e[u];i;i=i->next) if (!vis[i->point] && i->flow && h[u]==h[i->point]+i->cost)
{
int temp=aug(i->point, min(left, i->flow));
i->flow-=temp; i->pair->flow+=temp; left-=temp;
if (!left) break;
}
vis[u]=false;
return flow-left;
}
inline int costflow()
{
int ret=0;
while (spfa())
ret+=h[S]*aug(S, inf);
return ret;
}
[hdu 3376]Matrix Again的更多相关文章
- POJ 2135 Farm Tour && HDU 2686 Matrix && HDU 3376 Matrix Again 费用流求来回最短路
累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...
- hdu 3376 : Matrix Again【MCMF】
题目链接 题意:给定一个n*n的矩阵,找一条路,从左上角到右下角再到左上角,每个点最多经过一次,求路径上的点的权值的最大和. 将矩阵中每个点拆点,点容量为1,费用为点权值的相反数.每个点向自己右侧和下 ...
- HDU 2686 Matrix 3376 Matrix Again(费用流)
HDU 2686 Matrix 题目链接 3376 Matrix Again 题目链接 题意:这两题是一样的,仅仅是数据范围不一样,都是一个矩阵,从左上角走到右下角在从右下角走到左上角能得到最大价值 ...
- hdu 2686&&hdu 3376(拆点+构图+最小费用最大流)
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 4920 Matrix multiplication(bitset)
HDU 4920 Matrix multiplication 题目链接 题意:给定两个矩阵,求这两个矩阵相乘mod 3 思路:没什么好的想法,就把0的位置不考虑.结果就过了.然后看了官方题解,上面是用 ...
- HDU 3376 费用流 Matrix Again
题意: 给出一个n × n的矩阵,每个格子中有一个数字代表权值,找出从左上角出发到右下角的两条不相交的路径(起点和终点除外),使得两条路径权值之和最大. 分析: 如果n比较小的话是可以DP的,但是现在 ...
- hdu 2686 Matrix 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the n*n ...
- hdu 5569 matrix dp
matrix Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5569 D ...
- HDU 3376
http://acm.hdu.edu.cn/showproblem.php?pid=3376 题意:一个矩阵,每个点有价值,起点左上角终点右下角,每次只能走当前点的下一点或右一点,从起点走到终点,再从 ...
随机推荐
- hdu4734 F(x)
链接 这题当时在网络赛时很费劲的推出来的,以递推的形式写出来的,一些边界点特别不好控制,靠看数据改出来的.现在改出dfs形式,也是很简单的. 因为f(x)的数不会很大,直接保留前面枚举的数得出的结果即 ...
- windows+linux开发环境 解决laravel blade模板缓存问题
编码环境windows10 编码IDE:phpstorm 2016.2 PHP框架:laravel5.3 + 代码运行环境:centos7 + nginx 在开发过程中,上传blade模板文件到lin ...
- Deep Learning 15:RBM的学习
RBM是深度学习的核心,所以必须彻底清楚地理解RBM原理.推导及其训练方法 1.读学位论文“基于深度学习的人脸识别研究”: 对RBM.DBN的介绍比较详细,可以作为基础阅读,再去读英文论文. 2.RB ...
- SAP的物料归档
我们在对前台对物料进行删除时,是物理删除,也就是打个删除标志,并没有正真的从数据库里删除,在前台还是可以看到的,下面介绍一下SAP的归档处理可以 把已删除的物料在前台删除掉,注意:项目里根据情况得到领 ...
- Python爬虫:一些常用的爬虫技巧总结
爬虫在开发过程中也有很多复用的过程,这里总结一下,以后也能省些事情. 1.基本抓取网页 get方法 import urllib2 url = "http://www.baidu.com&qu ...
- 【bzoj1098】办公楼
[bzoj1098]办公楼 题意 FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄 ...
- pagemap, from the userspace perspective
pagemap, from the userspace perspective --------------------------------------- pagemap is a new (as ...
- 编写windows版ANE
1.编写WinANE.dll: #include <windows.h> #include <stdlib.h> #include <FlashRuntimeExtens ...
- Objective-C的面向对象中,类有真正的私有方法和私有属性么?
在Java/C#等面向对象语言中,方法的访问权限可以通过public/private/protected来控制其访问权限.而在OC中,方法却并没有访问修饰符.那么,我们有没有办法使其方法变为私有? 1 ...
- easyui treegrid 分页
$(function () { $('#maintable').treegrid({ width: '98%', height: 550, nowrap: true, striped: true, f ...