社区讨论
RE on 8 求助 QwQ
P4313文理分科参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mdgz0dka
- 此快照首次捕获于
- 2025/07/24 13:47 7 个月前
- 此快照最后确认于
- 2025/11/04 03:49 4 个月前
CPP
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
namespace flow{
#define LL long long
#define sz(a) int((a).size())
#define mem(a,x,n) memset(a,x,sizeof(*a)*(n+2))
#define pb emplace_back
const int N = 101*101*3+2+1;
int fn,S,T; int head[N]; int dis[N];
struct Edge{
int to,b; LL c;
Edge(int to=0,int b=0,LL c=0):to(to),b(b),c(c){}
}; vector<Edge> e[N];
void init(int n=0){S=n+1,T=fn=n+2;}
void addedge(int u,int v,LL w=1e18){e[u].pb(v,sz(e[v]),w);e[v].pb(u,sz(e[u])+1,0);}
bool bfs(){
static int l,r,q[N];
mem(head,0,fn); mem(dis,0,fn);
dis[S]=1; q[l=r=1]=S;
while(l<=r){
int u=q[l++];
for(auto ele : e[u]){
int v=ele.to,b=ele.b; LL c=ele.c;
if(c and !dis[v])
{dis[v]=dis[u]+1; q[++r]=v; if(v==T) return 1;}
}
}
return 0;
}
LL dfs(int u,LL in){
if(u==T) return in;
LL out=0;
for(int &i=head[u];i<sz(e[u]);++i){
auto ele=e[u][i];
int v=ele.to,b=ele.b; LL c=ele.c;
if(c and dis[v]==dis[u]+1){
if(LL f = dfs(v,min(c,in-out))){
e[u][i].c-=f; e[v][b].c+=f;
if((out+=f)==in) return in;
}else dis[v]=0;
}
}
return out;
}
LL Dinic(){LL res=0; while(bfs())res+=dfs(S,1e18); return res;}
}using flow::fn;using flow::S;using flow::T;using flow::addedge;
const int N = 101;
int n,m;
int art[(N+1)][(N+1)];
int sci[(N+1)][(N+1)];
int same_art[(N+1)][(N+1)];
int same_sci[(N+1)][(N+1)];
int tot;
int point[(N+1)][(N+1)];
int pit_art[(N+1)][(N+1)];
int pit_sci[(N+1)][(N+1)];
int xx[] = {0,0,1,0,-1};
int yy[] = {0,1,0,-1,0};
bool vis[(N+1)+1][(N+1)+1];
signed main(){
// std::ios::sync_with_stdio(false);
// std::cin.tie(0);
LL ans=0;
cin>>n>>m;
rep(i,1,n) rep(j,1,m) cin>>art[i][j],ans+=art[i][j];
rep(i,1,n) rep(j,1,m) cin>>sci[i][j],ans+=sci[i][j];
rep(i,1,n) rep(j,1,m) cin>>same_art[i][j],ans+=same_art[i][j];
rep(i,1,n) rep(j,1,m) cin>>same_sci[i][j],ans+=same_sci[i][j];
rep(i,1,n) rep(j,1,m) point[i][j]=++tot;
rep(i,1,n) rep(j,1,m) pit_art[i][j]=++tot;
rep(i,1,n) rep(j,1,m) pit_sci[i][j]=++tot;
flow::init(tot);
rep(i,1,n) rep(j,1,m) addedge(S,point[i][j],art[i][j]),addedge(S,pit_art[i][j],same_art[i][j]);
rep(i,1,n) rep(j,1,m) addedge(point[i][j],T,sci[i][j]),addedge(pit_sci[i][j],T,same_sci[i][j]);
rep(i,1,n) rep(j,1,m) vis[i][j]=1;
rep(i,1,n) rep(j,1,m) rep(k,0,4)
{int tx=i+xx[k],ty=j+yy[k]; if(vis[tx][ty]) addedge(pit_art[i][j],point[tx][ty]);}
rep(i,1,n) rep(j,1,m) rep(k,0,4)
{int tx=i+xx[k],ty=j+yy[k]; if(vis[tx][ty]) addedge(point[tx][ty],pit_sci[i][j]);}
ans = ans - flow::Dinic();
cout<<ans<<"\n";
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...