90分,TLE一个点。有大佬帮忙看看吗
查看原帖
90分,TLE一个点。有大佬帮忙看看吗
1038521
plown楼主2023/10/31 19:56
#include<bits/stdc++.h>
#define INF 2147483647
#define N 900000
using namespace std;
struct MF {
	struct edge {
		int ed,nxt,cap,flow;//容量与流量
	} e[N<<6];
	int head[N],cnt=0;

	int n,S=1,T;
	long long maxflow=0;//最大流

	int dep[N],cur[N];

	inline void init() {
		memset(head,-1,sizeof head);
		cnt=0;
	}

	inline void addedge(int u,int v,int w) {
		e[cnt]= {v,head[u],w,0};
		head[u]=cnt++;
		e[cnt]= {u,head[v],w,0};
		head[v]=cnt++;
	}

	inline bool bfs() {
		queue<int> q;
		memset(dep,0,sizeof(int)*(n+1));

		dep[S]=1;
		q.push(S);
		while(q.size()) {
			int u=q.front();
			q.pop();
			for(int i=head[u]; ~i; i=e[i].nxt) {
				int v=e[i].ed;
				if((!dep[v])&&(e[i].cap>e[i].flow)) {
					dep[v]=dep[u]+1;
					q.push(v);
				}
			}
		}
		return dep[T];
	}

	inline int dfs(int u,int flow) {
		if((u==T)||(!flow)) return flow;
		int ret=0;
		for(int& i=cur[u]; ~i; i=e[i].nxt) {
			int v=e[i].ed,d;
			if((dep[v]==dep[u]+1)&&(d=dfs(v,min(flow-ret,e[i].cap-e[i].flow)))) {
				ret+=d;
				e[i].flow+=d;
				e[i^1].flow-=d;
				if(ret==flow) return ret;
			}
		}
		return ret;
	}

	inline void dinic() {
		while(bfs()) {
			memcpy(cur,head,sizeof(int)*(n+1));
			maxflow+=dfs(S,INF);
		}
	}
} mf;

int n,m;
inline void initt() {
	mf.init();
	scanf("%d%d",&n,&m);
	mf.T=n*m;
	mf.n=n*m+2;
	for(int i=1; i<=n; ++i) {
		int u=(i-1)*m;
		for(int j=1; j<m; ++j) {
			int x;
			++u;
			scanf("%d",&x);
			mf.addedge(u,u+1,x);
		}
	}
	for(int i=1; i<n; ++i) {
		int u=(i-1)*m;
		for(int j=1; j<=m; ++j) {
			int x;
			++u;
			scanf("%d",&x);
			mf.addedge(u,u+m,x);
		}
	}
	for(int i=1; i<n; ++i) {
		int u=(i-1)*m;
		for(int j=1; j<m; ++j) {
			int x;
			++u;
			scanf("%d",&x);
			mf.addedge(u,u+m+1,x);
		}
	}
}
signed main() {
	initt();
	mf.dinic();
	printf("%lld",mf.maxflow);
	return 0;
}
2023/10/31 19:56
加载中...