hdu-3376-Matrix Again(最小费用最大流)
题意:
给一个矩形,从左上角走到右下角,并返回左上角(一个单元格只能走一次,左上角和右下角两个点除外)
并且从左上到右下只能往右和下两个方向。从右下返回左上只能走上和左两个方向!
分析:
拆点,最小费用最大流
。。
额。。。刘汝佳训练指南的最小费用最大流模板超时了。。。。。。。。。。。。。。。。。。
可能是因为边太少,点太多的缘故吧!还是数组实现的邻接表可靠啊!!!
- // File Name: 3376.cpp
- // Author: Zlbing
- // Created Time: 2013年08月15日 星期四 13时24分37秒
- #include<iostream>
- #include<string>
- #include<algorithm>
- #include<cstdlib>
- #include<cstdio>
- #include<set>
- #include<map>
- #include<vector>
- #include<cstring>
- #include<stack>
- #include<cmath>
- #include<queue>
- using namespace std;
- #define CL(x,v); memset(x,v,sizeof(x));
- #define INF 0x3f3f3f3f
- #define LL long long
- #define REP(i,r,n) for(int i=r;i<=n;i++)
- #define RREP(i,n,r) for(int i=n;i>=r;i--)
- /*
- const int MAXN=720010;
- struct Edge{
- int from,to,cap,flow,cost;
- };
- struct MCMF{
- int n,m,s,t;
- vector<Edge>edges;
- vector<int> G[MAXN];
- int inq[MAXN];
- int d[MAXN];
- int p[MAXN];
- int a[MAXN];
- void init(int n){
- this->n=n;
- for(int i=0;i<=n;i++)G[i].clear();
- edges.clear();
- }
- void AddEdge(int from,int to,int cap,int cost){
- Edge e;
- e.from=from,e.to=to,e.cap=cap,e.flow=0,e.cost=cost;
- edges.push_back(e);
- //edges.push_back((Edge){from,to,cap,0,cost});
- e.from=to,e.to=from,e.cap=0,e.flow=0,e.cost=-cost;
- //edges.push_back((Edge){to,from,0,0,-cost});
- edges.push_back(e);
- m=edges.size();
- G[from].push_back(m-2);
- G[to].push_back(m-1);
- }
- bool BellmanFord(int s,int t,int& flow,int& cost){
- for(int i=0;i<=n;i++)d[i]=INF;
- CL(inq,0);
- d[s]=0;inq[s]=1;p[s]=0;a[s]=INF;
- queue<int>Q;
- Q.push(s);
- while(!Q.empty()){
- int u=Q.front();Q.pop();
- inq[u]=0;
- for(int i=0;i<(int)G[u].size();i++){
- Edge& e=edges[G[u][i]];
- if(e.cap>e.flow&&d[e.to]>d[u]+e.cost){
- d[e.to]=d[u]+e.cost;
- p[e.to]=G[u][i];
- a[e.to]=min(a[u],e.cap-e.flow);
- if(!inq[e.to]){
- Q.push(e.to);
- inq[e.to]=1;
- }
- }
- }
- }
- if(d[t]==INF)return false;
- flow+=a[t];
- cost+=d[t]*a[t];
- int u=t;
- while(u!=s){
- edges[p[u]].flow+=a[t];
- edges[p[u]^1].flow-=a[t];
- u=edges[p[u]].from;
- }
- return true;
- }
- int Mincost(int s,int t){
- int flow=0,cost=0;
- while(BellmanFord(s,t,flow,cost));
- return cost;
- }
- };
- MCMF solver;
- */
- int sumFlow;
- const int MAXN = ;
- const int MAXM = ;
- struct Edge
- {
- int u, v, cap, cost;
- int next;
- }edge[MAXM<<];
- int NE;
- int head[MAXN], dist[MAXN], pp[MAXN];
- bool vis[MAXN];
- void init()
- {
- NE = ;
- memset(head, -, sizeof(head));
- }
- void addedge(int u, int v, int cap, int cost)
- {
- edge[NE].u = u; edge[NE].v = v; edge[NE].cap = cap; edge[NE].cost = cost;
- edge[NE].next = head[u]; head[u] = NE++;
- edge[NE].u = v; edge[NE].v = u; edge[NE].cap = ; edge[NE].cost = -cost;
- edge[NE].next = head[v]; head[v] = NE++;
- }
- bool SPFA(int s, int t, int n)
- {
- int i, u, v;
- queue <int> qu;
- memset(vis,false,sizeof(vis));
- memset(pp,-,sizeof(pp));
- for(i = ; i <= n; i++) dist[i] = INF;
- vis[s] = true; dist[s] = ;
- qu.push(s);
- while(!qu.empty())
- {
- u = qu.front(); qu.pop(); vis[u] = false;
- for(i = head[u]; i != -; i = edge[i].next)
- {
- v = edge[i].v;
- if(edge[i].cap && dist[v] > dist[u] + edge[i].cost)
- {
- dist[v] = dist[u] + edge[i].cost;
- pp[v] = i;
- if(!vis[v])
- {
- qu.push(v);
- vis[v] = true;
- }
- }
- }
- }
- if(dist[t] == INF) return false;
- return true;
- }
- int MCMF(int s, int t, int n) // minCostMaxFlow
- {
- int flow = ; // 总流量
- int i, minflow, mincost;
- mincost = ;
- while(SPFA(s, t, n))
- {
- minflow = INF + ;
- for(i = pp[t]; i != -; i = pp[edge[i].u])
- if(edge[i].cap < minflow)
- minflow = edge[i].cap;
- flow += minflow;
- for(i = pp[t]; i != -; i = pp[edge[i].u])
- {
- edge[i].cap -= minflow;
- edge[i^].cap += minflow;
- }
- mincost += dist[t] * minflow;
- }
- sumFlow = flow; // 题目需要流量,用于判断
- return mincost;
- }
- int main()
- {
- int n;
- while(~scanf("%d",&n))
- {
- //solver.init(n*n*2+5);
- init();
- int a;
- int s=;
- int t=((n-)*n+n-)*+;
- REP(i,,n-)
- REP(j,,n-){
- scanf("%d",&a);
- //solver.AddEdge((i*n+j)*2,(i*n+j)*2+1,1,-a);
- addedge((i*n+j)*,(i*n+j)*+,,-a);
- if(i!=n-)
- {
- //solver.AddEdge((i*n+j)*2+1,((i+1)*n+j)*2,1,0);
- addedge((i*n+j)*+,((i+)*n+j)*,,);
- }
- if(j!=n-)
- {
- //solver.AddEdge((i*n+j)*2+1,(i*n+j+1)*2,1,0);
- addedge((i*n+j)*+,(i*n+j+)*,,);
- }
- }
- addedge(s,s+,,);
- addedge(t-,t,,);
- int ans=-MCMF(s,t,t);
- printf("%d\n",ans);
- }
- return ;
- }
hdu-3376-Matrix Again(最小费用最大流)的更多相关文章
- hdu 2686 Matrix && hdu 3367 Matrix Again (最大费用最大流)
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdu 1533 Going Home 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1533 On a grid map there are n little men and n house ...
- HDU 5988.Coding Contest 最小费用最大流
Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- hdu 3667(拆边+最小费用最大流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3667 思路:由于花费的计算方法是a*x*x,因此必须拆边,使得最小费用流模板可用,即变成a*x的形式. ...
- hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))
Special Fish Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 3488(KM算法||最小费用最大流)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- hdu 1533 Going Home 最小费用最大流 入门题
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- HDU–5988-Coding Contest(最小费用最大流变形)
Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- POJ 2195 & HDU 1533 Going Home(最小费用最大流)
这就是一道最小费用最大流问题 最大流就体现到每一个'm'都能找到一个'H',但是要在这个基础上面加一个费用,按照题意费用就是(横坐标之差的绝对值加上纵坐标之差的绝对值) 然后最小费用最大流模板就是再用 ...
- [poj] 3422 Kaka's Matrix Travels || 最小费用最大流
原题 给一个N*N的方阵,从[1,1]到[n,n]走K次,走过每个方格加上上面的数,然后这个格上面的数变为0.求可取得的最大的值. 要求最大值,所以把边权全为负跑最小费用即可.因为只有第一次经过该点的 ...
随机推荐
- java解析xml文件四种方式
1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找 ...
- Mac OS命令行运行Sublime Text
Opening Sublime Text on command line as subl on Mac OS? Mac OS subl http://www.phodal.com/blog/mac-o ...
- css考核点整理(十)-响应式开发经验,响应式页面的三种核心技术是什么
响应式开发经验,响应式页面的三种核心技术是什么
- hibernate中使用HQL进行数据库查询
1.写的规则比较简单,我讲一下,如图Station这个不是数据库中的表,而是entity包中的类名Station,可以省略 select * 2.返回的类型自动转化为String类型,不用你自己再转化 ...
- Android EditText自动弹出输入法焦点
http://mobile.51cto.com/aprogram-403138.htm 1. 看一个manifest中Activity的配置,如果这个页面有EditText,并且我们想要进入这个页面的 ...
- Member var and Static var.
/* member variable and static variable: 1,invoke ways: member variable,also called 'instance' variab ...
- 一个Socket数据处理模型
Socket编程中,如何高效地接收和处理数据,这里介绍一个简单的编程模型. Socket索引 - SocketId 在给出编程模型之前,先提这样一个问题,程序中如何描述Socket连接? 为什么这么问 ...
- C#winform程序自定义鼠标样式
public void SetCursor(Bitmap cursor, Point hotPoint) { int hotX = hotPoint.X; int hotY = hotPoint.Y; ...
- devicePixelRatio
devicePixelRatio window.devicePixelRatio是设备上物理像素和逻辑像素的比例.公式表示就是:window.devicePixelRatio = 物理像素 / 逻辑像 ...
- 使用Raphael 画图(四) 路径(一) (javascript)
这章介绍路径,本人觉得这是比较难和精髓的一部分. 先介绍基本知识: 可以参考: http://www.chinasvg.com/support/svg-tutorial/svg-path-direct ...