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\n",tot-maxFlow());
63     }
64     return 0;
65 }

XTU 二分图和网络流 练习题 C. 方格取数(1),布布扣,bubuko.com

时间: 2024-12-26 20:36:21

XTU 二分图和网络流 练习题 C. 方格取数(1)的相关文章

XTU 二分图和网络流 练习题 J. Drainage Ditches

J. Drainage Ditches Time Limit: 1000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d      Java class name: Main Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is cover

XTU 二分图和网络流 练习题 B. Uncle Tom&#39;s Inherited Land*

B. Uncle Tom's Inherited Land* Time Limit: 1000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d      Java class name: Main Special Judge Your old uncle Tom inherited a piece of land from his great-great-uncle. Originally, the property had bee

734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

?问题描述:在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.?编程任务:对于给定的方格棋盘,按照取数要求编程找出总和最大的数.?数据输入:由文件grid.in提供输入数据.文件第1 行有2 个正整数m和n,分别表示棋盘的行数和列数.接下来的m行,每行有n个正整数,表示棋盘方格中的数. [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白

网络流 24题 方格取数

方格取数问题 题目描述 在一个有m*n个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. 输入格式 文件第1行有2个正整数m和n,分别表示棋盘的行数和列数.接下来的m行,每行有n个正整数,表示棋盘方格中的数.(0 <= m, n <= 30) 输出格式 取数的最大总和. 输入样例 33 1 2 3 3 2 3 2 3 1 输出样例 11 题目大意:     给出m*n的格子,相邻的格子的值不可同时取,最

网络流 [HDU 1565] 方格取数(1)

方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5961    Accepted Submission(s): 2268 Problem Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数

【网络流24题】二分图点权最大独立集(方格取数问题)

Description 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. 编程任务:对于给定的方格棋盘,按照取数要求编程找出总和最大的数. Input 第1 行有2 个正整数m和n,分别表示棋盘的行数和列数.接下来的m行,每行有n个正整数,表示棋盘方格中的数. Output 程序运行结束时,将取数的最大总和输出 Sample Input 3 3 1 2 3 3 2 3 2 3 1 Sa

网络流24题-方格取数

题目 方格中取数若干,两两不相邻,求最大选数和. 样例: 3 3 1 2 3 3 2 3 2 3 1 输出: 11 ans=2+3+3+3=11 黑白染色 建成二分图: 中间这些边连成INF(即不限制流量) 其实就是求最大独立集 定理:|二分图最大独立集|=|顶点数|-|二分图最大匹配数| 这个,我不会证明. 所以:|二分图最大独立集|=|总价值|-|二分图最大匹配价值| 考虑构图:s=>黑点=>白点=>t 首先,对与第[i][j]格,有价值为val[i][j] edge(s,黑点,va

[网络流24题] 方格取数问题

题面: 传送门 思路: 相邻的点不能同时取,那么在这个图中,实际上分了两种格子,每种格子相互之间随便取 那么就是二分图了 把相邻的点之间连边,得到一个二分图,我们实际上就是要求这个图的带权最大独立集 于是这道题转化为二分图问题,而二分图中最大独立集等于全集减去最小点覆盖,最小点覆盖等于这个图的最大匹配(都带权) 那么用网络流做就好了 将这个平面上的方格像国际象棋那样黑白染色 源点连黑点,容量为黑点权值 黑点连白点,容量为inf 白点连汇点,容量为白点权值 跑S-T最大流(即S-T最小割),用所有

[luogu2774] [网络流24题] 方格取数问题

传送门 某个方格如果选了,那么其周边的四个方格都不能选,有点二分图染色的味道. 考虑建立一个二分图.源点向\(x+y\)是奇数的连边,是偶数的向汇点连边. 然后根据最大和 = 全局和 - 舍弃和 = 全局和 - 最大流,求解 可以理解为在这个二分图中存在一个简单割,有一些点就被舍弃掉了,剩下的点就是我们要需选取的. #include <queue> #include <cstdio> #include <cstring> #include <algorithm&g