zoukankan      html  css  js  c++  java
  • XTU 二分图和网络流 练习题 C. 方格取数(1)

    C. 方格取数(1)

    Time Limit: 5000ms
    Memory Limit: 32768KB
    64-bit integer IO format: %I64d      Java class name: Main
     
    给你一个n*n的格子的棋盘,每个格子里面有一个非负数。
    从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。
     

    Input

    包括多个测试实例,每个测试实例包括一个整数n 和n*n个非负数(n<=20)
     

    Output

    对于每个测试实例,输出可能取得的最大的和
     

    Sample Input

    3
    75 15 21 
    75 15 28 
    34 70 5 

    Sample Output

    188

    解题:有人用状态压缩dp做啊,我只能对着别人的代码敲了。。。。。


     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 #define LL long long
    13 #define INF 0x3f3f3f3f
    14 using namespace std;
    15 const int maxn = 510;
    16 int mp[maxn*maxn],tot,n,src,sink;
    17 int c[maxn][maxn];
    18 bool vis[maxn];
    19 int dfs(int u,int low){
    20     if(u == sink) return low;
    21     if(vis[u]) return 0;
    22     vis[u] = true;
    23     for(int v = 0,flow; v <= sink; v++){
    24         if(c[u][v] && (flow = dfs(v,min(low,c[u][v])))){
    25             c[u][v] -= flow;
    26             c[v][u] += flow;
    27             return flow;
    28         }
    29     }
    30     return 0;
    31 }
    32 int maxFlow(){
    33     int ans = 0,flow;
    34     memset(vis,false,sizeof(vis));
    35     while(flow = dfs(src,INF)){
    36         memset(vis,false,sizeof(vis));
    37         ans += flow;
    38     }
    39     return ans;
    40 }
    41 int main(){
    42     int i,j,temp;
    43     while(~scanf("%d",&n)){
    44         j = n*n;
    45         src = tot = 0;
    46         sink = j+1;
    47         memset(mp,0,sizeof(mp));
    48         memset(c,0,sizeof(c));
    49         for(i = 1; i <= j; i++){
    50             scanf("%d",&temp);
    51             tot += temp;
    52             if(i <= n) mp[i] = !mp[i-1];
    53             else mp[i] = !mp[i-n];
    54             if(mp[i]){
    55                 if(i%n) c[i][i+1] = INF;//右边
    56                 if(i%n != 1) c[i][i-1] = INF;//左边
    57                 if(i <= n*(n-1)) c[i][n+i] = INF;//下边
    58                 if(i > n) c[i][i-n] = INF;//上边
    59                 c[src][i] = temp;
    60             }else c[i][sink] = temp;
    61         }
    62         printf("%d
    ",tot-maxFlow());
    63     }
    64     return 0;
    65 }
    View Code
  • 相关阅读:
    虚拟机下修改ip配置
    php cli 下 php.ini 配置
    centos 默认php 版本太低移到高版本的办法
    liux 防火墙以及开关
    [POI2006]OKR-Periods of Words(KMP)
    KMP
    [NOI1999]生日蛋糕(搜索)
    [HAOI2008]糖果传递
    [HEOI2015]兔子与樱花(贪心)
    [POJ3694]Network(Tarjan,LCA)
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/3870161.html
Copyright © 2011-2022 走看看