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;
}
}