关于网络流建图
查看原帖
关于网络流建图
340084
Vocanda楼主2020/11/14 14:29

建图顺序为什么会导致结果不一样

#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掉了

求大佬解释

2020/11/14 14:29
加载中...