建图顺序为什么会导致结果不一样
#include<bits/stdc++.h>
using namespace std;
#define gc getchar()
#define read() ({int s = 0,f = 1;char ch = gc;for(;!isdigit(ch);ch = gc)if(ch == '-')f = -1;for(;isdigit(ch);ch = gc)s = s * 10 + ch - '0';s * f;})
const int maxn = 1e6+10;
struct Node{
int v,next,flow;
}e[maxn<<1];
int head[maxn],tot = 1,hc[maxn];
int bh[110][110],dep[maxn];
int s,t,n,m;
void Add(int x,int y,int z){
e[++tot].v = y;
e[tot].next = head[x];
e[tot].flow = z;
head[x] = tot;
}
bool bfs(){
memset(dep,0,sizeof(dep));
queue<int>q;
q.push(s);
dep[s] = 1;
while(!q.empty()){
int x = q.front();q.pop();
for(int i = head[x];i;i = e[i].next){
int v = e[i].v;
if(dep[v] || e[i].flow <= 0)continue;
dep[v] = dep[x] + 1;
q.push(v);
if(v == t)return 1;
}
}
return 0;
}
int dfs(int x,int flow){
if(x == t || flow <= 0)return flow;
int left = flow,k = 0;
for(int i = hc[x];i && left;hc[x] = i,i = e[i].next){
int v = e[i].v;
if(dep[v] != dep[x] + 1 || e[i].flow <= 0)continue;
k = dfs(v,min(left,e[i].flow));
if(k <= 0)dep[v] = 0;
e[i].flow -= k,e[i^1].flow += k,left -= k;
}
return flow - left;
}
int dinic(){
int ans = 0,flow = 0;
while(bfs()){
memcpy(hc,head,sizeof(head));
while(1){
flow = dfs(s,0x3f3f3f3f);
ans += flow;
if(!flow)break;
}
}
return ans;
}
int main(){
n = read(),m = read();
int cnt = 2;
s = 1,t = 2;
int sum = 0;
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
int val = read();
sum += val;
bh[i][j] = ++cnt;
Add(s,bh[i][j],val);
Add(bh[i][j],s,0);
}
}
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
int val = read();
sum += val;
Add(bh[i][j],t,val);
Add(t,bh[i][j],0);
}
}
for(int i = 1;i < n;++i){
for(int j = 1;j <= m;++j){
int val = read();
sum += val;
cnt++;
Add(s,cnt,val);
Add(cnt,s,0);
Add(cnt,bh[i][j],0x3f3f3f3f);
Add(cnt,bh[i+1][j],0x3f3f3f3f);
Add(bh[i][j],cnt,0);
Add(bh[i+1][j],cnt,0);
}
}
for(int i = 1;i < n;++i){
for(int j = 1;j <= m;++j){
int val = read();
sum += val;
cnt++;
Add(t,cnt,0);
Add(cnt,t,val);
Add(cnt,bh[i][j],0);
Add(cnt,bh[i+1][j],0);
Add(bh[i][j],cnt,0x3f3f3f3f);
Add(bh[i+1][j],cnt,0x3f3f3f3f);
}
}
for(int i = 1;i <= n;++i){
for(int j = 1;j < m;++j){
int val = read();
sum += val;
cnt++;
Add(s,cnt,val);
Add(cnt,s,0);
Add(cnt,bh[i][j],0x3f3f3f3f);
Add(cnt,bh[i][j+1],0x3f3f3f3f);
Add(bh[i][j],cnt,0);
Add(bh[i][j+1],cnt,0);
}
}
for(int i = 1;i <= n;++i){
for(int j = 1;j < m;++j){
int val = read();
sum += val;
cnt++;
Add(t,cnt,0);
Add(cnt,t,val);
Add(cnt,bh[i][j],0);
Add(cnt,bh[i][j+1],0);
Add(bh[i][j],cnt,0x3f3f3f3f);
Add(bh[i][j+1],cnt,0x3f3f3f3f);
}
}
printf("%d\n",sum - dinic());
}
这个建图会爆零
#include<bits/stdc++.h>
using namespace std;
#define gc getchar()
#define read() ({int s = 0,f = 1;char ch = gc;for(;!isdigit(ch);ch = gc)if(ch == '-')f = -1;for(;isdigit(ch);ch = gc)s = s * 10 + ch - '0';s * f;})
const int maxn = 1e6+10;
struct Node{
int v,next,flow;
}e[maxn<<1];
int head[maxn],tot = 1,hc[maxn];
int bh[110][110],dep[maxn];
int s,t,n,m;
void Add(int x,int y,int z){
e[++tot].v = y;
e[tot].next = head[x];
e[tot].flow = z;
head[x] = tot;
}
bool bfs(){
memset(dep,0,sizeof(dep));
queue<int>q;
q.push(s);
dep[s] = 1;
while(!q.empty()){
int x = q.front();q.pop();
for(int i = head[x];i;i = e[i].next){
int v = e[i].v;
if(dep[v] || e[i].flow <= 0)continue;
dep[v] = dep[x] + 1;
q.push(v);
if(v == t)return 1;
}
}
return 0;
}
int dfs(int x,int flow){
if(x == t || flow <= 0)return flow;
int left = flow,k = 0;
for(int i = hc[x];i && left;hc[x] = i,i = e[i].next){
int v = e[i].v;
if(dep[v] != dep[x] + 1 || e[i].flow <= 0)continue;
k = dfs(v,min(left,e[i].flow));
if(k <= 0)dep[v] = 0;
e[i].flow -= k,e[i^1].flow += k,left -= k;
}
return flow - left;
}
int dinic(){
int ans = 0,flow = 0;
while(bfs()){
memcpy(hc,head,sizeof(head));
while(1){
flow = dfs(s,0x3f3f3f3f);
ans += flow;
if(!flow)break;
}
}
return ans;
}
int main(){
n = read(),m = read();
int cnt = 2;
s = 1,t = 2;
int sum = 0;
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
int val = read();
sum += val;
bh[i][j] = ++cnt;
Add(s,bh[i][j],val);
Add(bh[i][j],s,0);
}
}
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
int val = read();
sum += val;
Add(t,bh[i][j],0);
Add(bh[i][j],t,val);
}
}
for(int i = 1;i < n;++i){
for(int j = 1;j <= m;++j){
int val = read();
sum += val;
cnt++;
Add(s,cnt,val);
Add(cnt,s,0);
Add(cnt,bh[i][j],0x3f3f3f3f);
Add(bh[i][j],cnt,0);
Add(cnt,bh[i+1][j],0x3f3f3f3f);
Add(bh[i+1][j],cnt,0);
}
}
for(int i = 1;i < n;++i){
for(int j = 1;j <= m;++j){
int val = read();
sum += val;
cnt++;
Add(t,cnt,0);
Add(cnt,t,val);
Add(cnt,bh[i][j],0);
Add(bh[i][j],cnt,0x3f3f3f3f);
Add(cnt,bh[i+1][j],0);
Add(bh[i+1][j],cnt,0x3f3f3f3f);
}
}
for(int i = 1;i <= n;++i){
for(int j = 1;j < m;++j){
int val = read();
sum += val;
cnt++;
Add(s,cnt,val);
Add(cnt,s,0);
Add(cnt,bh[i][j],0x3f3f3f3f);
Add(bh[i][j],cnt,0);
Add(cnt,bh[i][j+1],0x3f3f3f3f);
Add(bh[i][j+1],cnt,0);
}
}
for(int i = 1;i <= n;++i){
for(int j = 1;j < m;++j){
int val = read();
sum += val;
cnt++;
Add(t,cnt,0);
Add(cnt,t,val);
Add(cnt,bh[i][j],0);
Add(bh[i][j],cnt,0x3f3f3f3f);
Add(cnt,bh[i][j+1],0);
Add(bh[i][j+1],cnt,0x3f3f3f3f);
}
}
printf("%d\n",sum - dinic());
}
这个建图就A掉了
求大佬解释