擦,搞了几个模板,都有错,就这个还好吧
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <vector> #include <queue> #include <cstdlib> #include <string> #include <set> #include <stack> #define LL long long #define pii pair<int,int> #define INF 0x3f3f3f3f using namespace std; const int maxn = 3000; struct arc { int to,flow,next; arc(int x = 0,int y = 0,int z = 0) { to = x; flow = y; next = z; } }; arc e[maxn*10]; int head[maxn],d[maxn],tot; int S,T,q[maxn],hd,tail,n,m; void add(int u,int v,int flow) { e[tot] = arc(v,flow,head[u]); head[u] = tot++; e[tot] = arc(u,0,head[v]); head[v] = tot++; } bool bfs() { for(int i = 1; i <= T; i++) d[i] = 0; d[S] = 1; hd = tail = 0; q[tail++] = S; while(hd < tail) { int u = q[hd++]; for(int i = head[u]; ~i; i = e[i].next) { if(e[i].flow && !d[e[i].to]) { d[e[i].to] = d[u]+1; q[tail++] = e[i].to; } } } return d[T]; } int dfs(int u,int low) { int tmp = 0,f; if(u == T || !low) return low; for(int i = head[u]; ~i; i = e[i].next) { if(d[e[i].to] == d[u]+1 && (f = dfs(e[i].to,min(low,e[i].flow)))) { tmp += f; e[i].flow -= f; e[i^1].flow += f; low -= f; if(!low) break; } } return tmp; } void init(){ memset(head,-1,sizeof(head)); tot = 0; } int main(){ while(scanf("%d%d", &m,&n) != EOF) { init(); int x; int sum = 0; S = 0; T = m * n + 1; for(int i = 1; i <= m; ++ i) for(int j = 1; j <= n; ++ j) { scanf("%d", &x); sum += x; if((i + j) & 1) { add(S, (i - 1) * n + j, x); //上 if(i > 1) add((i - 1) * n + j, (i - 2) * n + j, INF); //下 if(i < m) add((i - 1) * n + j, i * n + j, INF); //左 if(j > 1) add((i - 1) * n + j, (i -1) * n + j - 1, INF); //右 if(j < n) add((i - 1) * n + j, (i - 1) * n + j + 1, INF); } else add((i - 1) * n + j, T, x); } int ans = 0; while(bfs())ans+=dfs(S,INF); printf("%d\n",sum - ans); } }
原来边就有权值的:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <vector> #include <queue> #include <cstdlib> #include <string> #include <set> #include <stack> #define LL long long #define pii pair<int,int> #define INF 0x3f3f3f3f using namespace std; const int maxn = 3000; struct arc { int to,cap,flow,next; arc(int x= 0 ,int y=0 ,int z=0 ,int u=0) { to = x; cap = y; flow = z; next = u; } }; arc e[maxn*10]; int head[maxn],d[maxn],tot; int S,T,q[maxn],hd,tail,n,m; void add(int u,int v,int cap,int flow) { e[tot] = arc(v,cap,flow,head[u]); head[u] = tot++; e[tot] = arc(u,0,-flow,head[v]); head[v] = tot++; } bool bfs() { for(int i = 1; i <= T; i++) d[i] = 0; d[S] = 1; hd = tail = 0; q[tail++] = S; while(hd < tail) { int u = q[hd++]; for(int i = head[u]; ~i; i = e[i].next) { if(e[i].cap > e[i].flow && !d[e[i].to]) { d[e[i].to] = d[u]+1; q[tail++] = e[i].to; } } } return d[T]; } int dfs(int u,int low) { int tmp = 0,f; if(u == T || !low) return low; for(int i = head[u]; ~i; i = e[i].next) { if(d[e[i].to] == d[u]+1 && (f = dfs(e[i].to,min(low,e[i].cap-e[i].flow)))) { tmp += f; e[i].flow += f; e[i^1].flow -= f; low -= f; if(!low) break; } } return tmp; } void init(){ memset(head,-1,sizeof(head)); tot = 0; } int main(){ while(scanf("%d%d", &m,&n) != EOF) { init(); int x; int sum = 0; S = 0; T = m * n + 1; for(int i = 1; i <= m; ++ i) for(int j = 1; j <= n; ++ j) { scanf("%d", &x); sum += x; if((i + j) & 1) { add(S, (i - 1) * n + j, x,0); //上 if(i > 1) add((i - 1) * n + j, (i - 2) * n + j, INF,0); //下 if(i < m) add((i - 1) * n + j, i * n + j, INF,0); //左 if(j > 1) add((i - 1) * n + j, (i -1) * n + j - 1, INF,0); //右 if(j < n) add((i - 1) * n + j, (i - 1) * n + j + 1, INF,0); } else add((i - 1) * n + j, T, x,0); } int ans = 0; while(bfs())ans+=dfs(S,INF); printf("%d\n",sum - ans); } }
时间: 2024-12-28 13:03:51