求助
查看原帖
求助
377969
george0929楼主2025/6/12 20:09

过不了样例三但能过样例四,求助,思路和第一篇题解一样,但是使用了 dinic。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=1e17;
struct NWF{
	int S,T,N;
	vector<int> V[100005];
	struct edge{
		int v,w;
	}e[1000005];int tot=1;
	void add(int u,int v,int w){
//		if(w==inf) cerr<<u<<" "<<v<<" inf\n";
//		else cerr<<u<<" "<<v<<" "<<w<<"\n";
		e[++tot]={v,w};V[u].push_back(tot);
		e[++tot]={u,0};V[v].push_back(tot);
	}
	void add2(int u,int v,int w){
//		if(w==inf) cerr<<u<<" "<<v<<" inf\n";
//		else cerr<<u<<" "<<v<<" "<<w<<"\n";
		e[++tot]={v,w};V[u].push_back(tot);
		e[++tot]={u,w};V[v].push_back(tot);
	}
	int dis[100005],now[100005];
	bool bfs(){
		queue<int> Q;
		for(int i=1;i<=N;i++) dis[i]=inf,now[i]=0;
		Q.push(S);
		dis[S]=0;
		while(!Q.empty()){
			int u=Q.front();
			Q.pop();
			for(int id:V[u]){
				int v=e[id].v,w=e[id].w;
				if(dis[v]==inf&&w){
					dis[v]=dis[u]+1;
					Q.push(v);
					if(v==T) return 1;
				}
			}
		}
		return 0;
	}
	int dfs(int u,int sum){
		if(u==T) return sum;
		int res=0;
		for(int i=now[u];i<(int)V[u].size()&&sum;i=now[u]){
			now[u]++;
			int id=V[u][i];
			int v=e[id].v,w=e[id].w;
			if(dis[v]!=dis[u]+1||!w) continue;
			int k=dfs(v,min(sum,w));
			res+=k;
			sum-=k;
			e[id].w-=k;
			e[id^1].w+=k;
		}
		if(!res) dis[u]=inf;
		return res;
	}
	int runflow(int _s,int _t){
		S=_s,T=_t;
		int ans=0;
		while(bfs()) ans+=dfs(S,inf);
		return ans;
	}
	int bkflow(int _s,int _t,int rem){
		S=_s,T=_t;
		int ans=0;
		while(bfs()&&rem){
			int tmp=dfs(S,rem);
			ans+=tmp;
			rem-=tmp;
		}
		return ans;
	}
}G;
int n,mp[205][205];
int pos(int i,int j){
	return (i-1)*n+j;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>mp[i][j];
		}
	}
	int flow=0,ans=0;
	int S=n*n+1,T=n*n+2;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(mp[i][j]==-1) continue;
			if(j!=n&&mp[i][j+1]!=-1){
				G.add2(pos(i,j),pos(i,j+1),1);
			}
			if(i!=n&&mp[i+1][j]!=-1){
				G.add2(pos(i,j),pos(i+1,j),1);
			}
		}
	}
	vector<pair<int,int>> v;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(mp[i][j]>0){
				v.push_back({mp[i][j],pos(i,j)});
//				if(mp[i][j]==1) G.add(S,pos(i,j),inf);else
				G.add(pos(i,j),T,inf);
//				if(pos(i,j)==4) G.add(pos(i,j),T,inf);
			}
		}
	}
	sort(v.begin(),v.end());
	G.N=T;
	for(int i=0;i<(int)v.size()-1;i++){
		int x=v[i].second;
		for(int t:G.V[x]){
			if(G.e[t].v==T){
				flow-=G.bkflow(x,S,G.e[t^1].w);
				G.e[t].w=0;
				G.e[t^1].w=0;
			}
		}
		G.add(S,x,inf);
		flow+=G.runflow(S,T);
//		cout<<flow<<"\n";
		ans+=flow*(v[i+1].first-v[i].first);
	}
	cout<<ans<<"\n";
	return 0;
}
2025/6/12 20:09
加载中...