方格取数

Time Limit: 1000ms
Memory Limit: 65535KB

This problem will be judged on HRBUST. Original ID: 1214
64-bit integer IO format: %lld      Java class name: Main

 

设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放人数字0。如下图所示(见样例 ,黄色和蓝色分别为两次走的路线,其中绿色的格子为黄色和蓝色共同走过的):

A
             
    13     6    
        7      
      14        
  21       4    
    15          
  14            
             
B

某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从A点到B点共走两次,试找出2条这样的路径,使得取得的数之和为最大

 
 

Input

 有多组测试数据,每组格式如下:
    第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。

 

Output

与输入对应,有多组输出,每组只需输出一个整数,表示2条路径上取得的最大的和。

 

Sample Input

8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0

Sample Output

  1. 67

Source

 
解题:拆点费用流。见http://www.cnblogs.com/crackpotisback/p/3971435.html
 
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <climits>
  7. #include <vector>
  8. #include <queue>
  9. #include <cstdlib>
  10. #include <string>
  11. #include <set>
  12. #include <stack>
  13. #define LL long long
  14. #define pii pair<int,int>
  15. #define INF 0x3f3f3f3f
  16. using namespace std;
  17. const int maxn = ;
  18. struct arc{
  19. int v,w,f,next;
  20. arc(int x = ,int y = ,int z = ,int nxt = ){
  21. v = x;
  22. w = y;
  23. f = z;
  24. next = nxt;
  25. }
  26. };
  27. arc e[];
  28. int head[maxn],d[maxn],p[maxn],S,T,n,mp[][],tot;
  29. bool in[maxn];
  30. queue<int>q;
  31. void add(int u,int v,int w,int f){
  32. e[tot] = arc(v,w,f,head[u]);
  33. head[u] = tot++;
  34. e[tot] = arc(u,-w,,head[v]);
  35. head[v] = tot++;
  36. }
  37. bool spfa(){
  38. for(int i = ; i < maxn; i++){
  39. d[i] = INF;
  40. in[i] = false;
  41. p[i] = -;
  42. }
  43. while(!q.empty()) q.pop();
  44. d[S] = ;
  45. in[S] = true;
  46. q.push(S);
  47. while(!q.empty()){
  48. int u = q.front();
  49. q.pop();
  50. in[u] = false;
  51. for(int i = head[u]; ~i; i = e[i].next){
  52. if(e[i].f > && d[e[i].v] > d[u] + e[i].w){
  53. d[e[i].v] = d[u] + e[i].w;
  54. p[e[i].v]= i;
  55. if(!in[e[i].v]){
  56. in[e[i].v] = true;
  57. q.push(e[i].v);
  58. }
  59. }
  60. }
  61. }
  62. return p[T] > -;
  63. }
  64. int solve(){
  65. int tmp = ,minV;
  66. while(spfa()){
  67. minV = INF;
  68. for(int i = p[T]; ~i; i = p[e[i^].v])
  69. minV = min(minV,e[i].f);
  70. for(int i = p[T]; ~i; i = p[e[i^].v]){
  71. e[i].f -= minV;
  72. e[i^].f += minV;
  73. tmp += minV*e[i].w;
  74. }
  75. }
  76. return tmp;
  77. }
  78. int main() {
  79. int x,y,w;
  80. while(~scanf("%d",&n)){
  81. memset(mp,,sizeof(mp));
  82. memset(head,-,sizeof(head));
  83. S = tot = ;
  84. T = n*n*+;
  85. while(scanf("%d %d %d",&x,&y,&w),x||y||w) mp[x][y] = w;
  86. for(int i = ; i <= n; i++){
  87. for(int j = ; j <= n; j++){
  88. add(n*(i-)+j,n*(i-)+j+n*n,-mp[i][j],);
  89. add(n*(i-)+j,n*(i-)+j+n*n,,INF);
  90. if(i < n) add(n*(i-)+j+n*n,n*i+j,,INF);
  91. if(j < n) add(n*(i-)+j+n*n,n*(i-)+j+,,INF);
  92. }
  93. }
  94. add(S,,,);
  95. add(n*n*,T,,);
  96. printf("%d\n",-solve());
  97. }
  98. return ;
  99. }

HRBUST 1214 方格取数的更多相关文章

  1. HRBUST - 1214 NOIP2000提高组 方格取数(多线程dp)

    方格取数 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放人数字0.如下图所示(见样例 ,黄色和蓝色分别为两次走的路线,其中绿色的格子为黄色和蓝色共同走过的 ...

  2. HDU 1565&1569 方格取数系列(状压DP或者最大流)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  3. NOIP200003方格取数

    NOIP200003方格取数 难度级别: D: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 XYZ 是首师大附中信息技术团编 ...

  4. vijos 1563 疯狂的方格取数

    P1653疯狂的方格取数 Accepted 标签:天才的talent[显示标签]   背景 Due to the talent of talent123,当talent123做完NOIP考了两次的二取 ...

  5. [HDU 1565+1569] 方格取数

    HDU 1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)

      HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...

  7. HDU-1565 方格取数(1)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Me ...

  8. BZOJ 1475: 方格取数( 网络流 )

    本来想写道水题....结果调了这么久!就是一个 define 里面少加了个括号 ! 二分图最大点权独立集...黑白染色一下 , 然后建图 : S -> black_node , white_no ...

  9. [动态规划]P1004 方格取数

    ---恢复内容开始--- 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 ...

随机推荐

  1. samba笔记

    ############ 1.安装网络yum ############ 2.安装createrepo [root@localhost ~]# yum install createrepo-0.9.8- ...

  2. jQuery - 选中复选框则弹出提示框

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. oc28--Property增强

    // // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject /* { @public int ...

  4. 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”

    解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合” 最近更新: 2013-2-15    587   很少写WinForm程序第一次使用ListBox控件就遇到了比 ...

  5. mysql数据库操作(1)

    1.mysql 数据库备份: 语法: MYSQLDUMP -uUSER -pPASS DataBase > Path 其中:USER 是用户名,PASS 是密码,DataBase 是数据库名, ...

  6. PCB WCF Web接口增减参数后,在客户端不更新的情况,是否影响客户端,评估测试

    1.目的:由于接口众多,服务端变更接口,会造成服务停用更新,造成客户端不能使用或报错, 在此评估[Web中心]此服务端,接口接口参数增加或减少,是否对客户端造成影响 2.评估内容:服务端增加单值参数, ...

  7. codevs1253 超级市场(dp)

    1253 超级市场  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 某人喜欢按照自己的规则去市场买菜,他每天 ...

  8. 洛谷P2916 [USACO08NOV]为母牛欢呼(最小生成树)

    P2916 [USACO08NOV]为母牛欢呼Cheering up the C… 题目描述 Farmer John has grown so lazy that he no longer wants ...

  9. hdu3507Print Article(斜率优化dp)

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  10. A - Fox And Snake

    Problem description Fox Ciel starts to learn programming. The first task is drawing a fox! However, ...