zkw费用流 TLE 30pts 悬赏关注
查看原帖
zkw费用流 TLE 30pts 悬赏关注
352426
就决定是你辣楼主2023/3/6 20:18

rt,基本上把自己能想到的所有优化都加上了,但是还是会TLE

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
const int maxn=3e5+10;
const int inf=0x3f3f3f3f;

int head[maxn],nxt[maxn],to[maxn],w[maxn],c[maxn],tot=1;
int cost;
void add(int u,int v,int ci,int wi) {
	to[++tot]=v,nxt[tot]=head[u],head[u]=tot,c[tot]=wi,w[tot]=ci;
	to[++tot]=u,nxt[tot]=head[v],head[v]=tot,c[tot]=0,w[tot]=-ci;
}
int dis[maxn],s,t,n,m;
int vis[maxn];
int now[maxn];
bool spfa(){
	memset(dis,0x3f,sizeof(dis));	
	queue<int>q;
	q.push(s),dis[s]=0,vis[s]=1;
	now[s]=head[s];
	while(!q.empty()){
		int u=q.front();
		q.pop(),vis[u]=0;
		for(int i=now[u];i;i=nxt[i]){
		    now[u]=i;
			int v=to[i];
			if(c[i]&&dis[v]>dis[u]+w[i]){
				dis[v]=dis[u]+w[i];
				now[v]=head[v];
				if(!vis[v])q.push(v),vis[v]=1;
			}
		}
	} 
	return dis[t]!=inf;
}
int dfs(int u,int flow){
	if(u==t)return flow;
	vis[u]=1;
	int rest=0;
	for(int i=head[u];i;i=nxt[i]){
		int v=to[i];
		if(!vis[v]&&c[i]&&dis[v]==dis[u]+w[i]){
			int x=dfs(v,min(flow-rest,c[i]));
			if(x)cost+=x*w[i],c[i]-=x,c[i^1]+=x,rest+=x;
			if(!x)dis[v]=0;
		}
	}
	vis[u]=0;
	return rest;

}
int a[105][105];
int main(){
	n=read();
	t=n*n+n+1,s=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			int x=read();
			a[i][j]=x;
			if(j>i){
				if(x==1){
					add(s,n*n+j,0,1);
				}
				else if(x==2){
					add(s,(i-1)*n+j,0,1);
					add((i-1)*n+j,n*n+i,0,1);
					add((i-1)*n+j,n*n+j,0,1);
				}
				else add(s,n*n+i,0,1);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<n;j++){
			add(n*n+i,t,j,1);
		} 
	}
	int ans=0;
	while(spfa()){
		int x;
		while(x=dfs(s,inf))ans+=x;
	}
	
	cout<<((n-1)*(n-2)*n)/6-cost<<endl;
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if(a[i][j]<2)continue;
			for(int k=head[(i-1)*n+j];k;k=nxt[k]){
				if(to[k]&&c[k]==0){
					a[i][j]=(to[k]-n*n==j);
					a[j][i]=a[i][j]^1;
				}
			}
		}
	} 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
}
2023/3/6 20:18
加载中...