题意:

给一个矩形,从左上角走到右下角,并返回左上角(一个单元格只能走一次,左上角和右下角两个点除外)

并且从左上到右下只能往右和下两个方向。从右下返回左上只能走上和左两个方向!

分析:

拆点,最小费用最大流

。。

额。。。刘汝佳训练指南的最小费用最大流模板超时了。。。。。。。。。。。。。。。。。。

可能是因为边太少,点太多的缘故吧!还是数组实现的邻接表可靠啊!!!

  1. // File Name: 3376.cpp
  2. // Author: Zlbing
  3. // Created Time: 2013年08月15日 星期四 13时24分37秒
  4.  
  5. #include<iostream>
  6. #include<string>
  7. #include<algorithm>
  8. #include<cstdlib>
  9. #include<cstdio>
  10. #include<set>
  11. #include<map>
  12. #include<vector>
  13. #include<cstring>
  14. #include<stack>
  15. #include<cmath>
  16. #include<queue>
  17. using namespace std;
  18. #define CL(x,v); memset(x,v,sizeof(x));
  19. #define INF 0x3f3f3f3f
  20. #define LL long long
  21. #define REP(i,r,n) for(int i=r;i<=n;i++)
  22. #define RREP(i,n,r) for(int i=n;i>=r;i--)
  23. /*
  24. const int MAXN=720010;
  25.  
  26. struct Edge{
  27. int from,to,cap,flow,cost;
  28. };
  29. struct MCMF{
  30. int n,m,s,t;
  31. vector<Edge>edges;
  32. vector<int> G[MAXN];
  33. int inq[MAXN];
  34. int d[MAXN];
  35. int p[MAXN];
  36. int a[MAXN];
  37. void init(int n){
  38. this->n=n;
  39. for(int i=0;i<=n;i++)G[i].clear();
  40. edges.clear();
  41. }
  42. void AddEdge(int from,int to,int cap,int cost){
  43. Edge e;
  44. e.from=from,e.to=to,e.cap=cap,e.flow=0,e.cost=cost;
  45. edges.push_back(e);
  46. //edges.push_back((Edge){from,to,cap,0,cost});
  47. e.from=to,e.to=from,e.cap=0,e.flow=0,e.cost=-cost;
  48. //edges.push_back((Edge){to,from,0,0,-cost});
  49. edges.push_back(e);
  50. m=edges.size();
  51. G[from].push_back(m-2);
  52. G[to].push_back(m-1);
  53. }
  54. bool BellmanFord(int s,int t,int& flow,int& cost){
  55. for(int i=0;i<=n;i++)d[i]=INF;
  56. CL(inq,0);
  57. d[s]=0;inq[s]=1;p[s]=0;a[s]=INF;
  58.  
  59. queue<int>Q;
  60. Q.push(s);
  61. while(!Q.empty()){
  62. int u=Q.front();Q.pop();
  63. inq[u]=0;
  64. for(int i=0;i<(int)G[u].size();i++){
  65. Edge& e=edges[G[u][i]];
  66. if(e.cap>e.flow&&d[e.to]>d[u]+e.cost){
  67. d[e.to]=d[u]+e.cost;
  68. p[e.to]=G[u][i];
  69. a[e.to]=min(a[u],e.cap-e.flow);
  70. if(!inq[e.to]){
  71. Q.push(e.to);
  72. inq[e.to]=1;
  73. }
  74. }
  75. }
  76. }
  77. if(d[t]==INF)return false;
  78. flow+=a[t];
  79. cost+=d[t]*a[t];
  80. int u=t;
  81. while(u!=s){
  82. edges[p[u]].flow+=a[t];
  83. edges[p[u]^1].flow-=a[t];
  84. u=edges[p[u]].from;
  85. }
  86. return true;
  87. }
  88. int Mincost(int s,int t){
  89. int flow=0,cost=0;
  90. while(BellmanFord(s,t,flow,cost));
  91. return cost;
  92. }
  93. };
  94. MCMF solver;
  95. */
  96. int sumFlow;
  97. const int MAXN = ;
  98. const int MAXM = ;
  99. struct Edge
  100. {
  101. int u, v, cap, cost;
  102. int next;
  103. }edge[MAXM<<];
  104. int NE;
  105. int head[MAXN], dist[MAXN], pp[MAXN];
  106. bool vis[MAXN];
  107. void init()
  108. {
  109. NE = ;
  110. memset(head, -, sizeof(head));
  111. }
  112. void addedge(int u, int v, int cap, int cost)
  113. {
  114. edge[NE].u = u; edge[NE].v = v; edge[NE].cap = cap; edge[NE].cost = cost;
  115. edge[NE].next = head[u]; head[u] = NE++;
  116. edge[NE].u = v; edge[NE].v = u; edge[NE].cap = ; edge[NE].cost = -cost;
  117. edge[NE].next = head[v]; head[v] = NE++;
  118. }
  119. bool SPFA(int s, int t, int n)
  120. {
  121. int i, u, v;
  122. queue <int> qu;
  123. memset(vis,false,sizeof(vis));
  124. memset(pp,-,sizeof(pp));
  125. for(i = ; i <= n; i++) dist[i] = INF;
  126. vis[s] = true; dist[s] = ;
  127. qu.push(s);
  128. while(!qu.empty())
  129. {
  130. u = qu.front(); qu.pop(); vis[u] = false;
  131. for(i = head[u]; i != -; i = edge[i].next)
  132. {
  133. v = edge[i].v;
  134. if(edge[i].cap && dist[v] > dist[u] + edge[i].cost)
  135. {
  136. dist[v] = dist[u] + edge[i].cost;
  137. pp[v] = i;
  138. if(!vis[v])
  139. {
  140. qu.push(v);
  141. vis[v] = true;
  142. }
  143. }
  144. }
  145. }
  146. if(dist[t] == INF) return false;
  147. return true;
  148. }
  149. int MCMF(int s, int t, int n) // minCostMaxFlow
  150. {
  151. int flow = ; // 总流量
  152. int i, minflow, mincost;
  153. mincost = ;
  154. while(SPFA(s, t, n))
  155. {
  156. minflow = INF + ;
  157. for(i = pp[t]; i != -; i = pp[edge[i].u])
  158. if(edge[i].cap < minflow)
  159. minflow = edge[i].cap;
  160. flow += minflow;
  161. for(i = pp[t]; i != -; i = pp[edge[i].u])
  162. {
  163. edge[i].cap -= minflow;
  164. edge[i^].cap += minflow;
  165. }
  166. mincost += dist[t] * minflow;
  167. }
  168. sumFlow = flow; // 题目需要流量,用于判断
  169. return mincost;
  170. }
  171. int main()
  172. {
  173. int n;
  174. while(~scanf("%d",&n))
  175. {
  176. //solver.init(n*n*2+5);
  177. init();
  178. int a;
  179. int s=;
  180. int t=((n-)*n+n-)*+;
  181. REP(i,,n-)
  182. REP(j,,n-){
  183. scanf("%d",&a);
  184. //solver.AddEdge((i*n+j)*2,(i*n+j)*2+1,1,-a);
  185. addedge((i*n+j)*,(i*n+j)*+,,-a);
  186. if(i!=n-)
  187. {
  188. //solver.AddEdge((i*n+j)*2+1,((i+1)*n+j)*2,1,0);
  189. addedge((i*n+j)*+,((i+)*n+j)*,,);
  190. }
  191. if(j!=n-)
  192. {
  193. //solver.AddEdge((i*n+j)*2+1,(i*n+j+1)*2,1,0);
  194. addedge((i*n+j)*+,(i*n+j+)*,,);
  195. }
  196. }
  197. addedge(s,s+,,);
  198. addedge(t-,t,,);
  199. int ans=-MCMF(s,t,t);
  200. printf("%d\n",ans);
  201. }
  202. return ;
  203. }

hdu-3376-Matrix Again(最小费用最大流)的更多相关文章

  1. hdu 2686 Matrix && hdu 3367 Matrix Again (最大费用最大流)

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

  2. 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 ...

  3. HDU 5988.Coding Contest 最小费用最大流

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

  4. hdu 3667(拆边+最小费用最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3667 思路:由于花费的计算方法是a*x*x,因此必须拆边,使得最小费用流模板可用,即变成a*x的形式. ...

  5. hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))

    Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. hdu 3488(KM算法||最小费用最大流)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  7. hdu 1533 Going Home 最小费用最大流 入门题

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  8. HDU–5988-Coding Contest(最小费用最大流变形)

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

  9. POJ 2195 & HDU 1533 Going Home(最小费用最大流)

    这就是一道最小费用最大流问题 最大流就体现到每一个'm'都能找到一个'H',但是要在这个基础上面加一个费用,按照题意费用就是(横坐标之差的绝对值加上纵坐标之差的绝对值) 然后最小费用最大流模板就是再用 ...

  10. [poj] 3422 Kaka's Matrix Travels || 最小费用最大流

    原题 给一个N*N的方阵,从[1,1]到[n,n]走K次,走过每个方格加上上面的数,然后这个格上面的数变为0.求可取得的最大的值. 要求最大值,所以把边权全为负跑最小费用即可.因为只有第一次经过该点的 ...

随机推荐

  1. java解析xml文件四种方式

    1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找 ...

  2. 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 ...

  3. css考核点整理(十)-响应式开发经验,响应式页面的三种核心技术是什么

    响应式开发经验,响应式页面的三种核心技术是什么

  4. hibernate中使用HQL进行数据库查询

    1.写的规则比较简单,我讲一下,如图Station这个不是数据库中的表,而是entity包中的类名Station,可以省略 select * 2.返回的类型自动转化为String类型,不用你自己再转化 ...

  5. Android EditText自动弹出输入法焦点

    http://mobile.51cto.com/aprogram-403138.htm 1. 看一个manifest中Activity的配置,如果这个页面有EditText,并且我们想要进入这个页面的 ...

  6. Member var and Static var.

    /* member variable and static variable: 1,invoke ways: member variable,also called 'instance' variab ...

  7. 一个Socket数据处理模型

    Socket编程中,如何高效地接收和处理数据,这里介绍一个简单的编程模型. Socket索引 - SocketId 在给出编程模型之前,先提这样一个问题,程序中如何描述Socket连接? 为什么这么问 ...

  8. C#winform程序自定义鼠标样式

    public void SetCursor(Bitmap cursor, Point hotPoint) { int hotX = hotPoint.X; int hotY = hotPoint.Y; ...

  9. devicePixelRatio

    devicePixelRatio window.devicePixelRatio是设备上物理像素和逻辑像素的比例.公式表示就是:window.devicePixelRatio = 物理像素 / 逻辑像 ...

  10. 使用Raphael 画图(四) 路径(一) (javascript)

    这章介绍路径,本人觉得这是比较难和精髓的一部分. 先介绍基本知识: 可以参考: http://www.chinasvg.com/support/svg-tutorial/svg-path-direct ...