只过了2,3两个点,其他全T,但自己造数据测好像跑得又没那么慢
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=26;
int n,ans,kkk;
int a[N][N];
int bz[N],by[N],fd[N],upd[N];
int visz[N],visy[N];
bool dfs(int now){
visz[now]=1;
for(int i=1;i<=n;i++){
if(visy[i]==0){
if(bz[now]+by[i]==a[now][i]){
visy[i]=1;
if(fd[i]==0||dfs(fd[i])==true){
fd[i]=now;
return true;
}
}
else if(bz[now]+by[i]>a[now][i])
{
kkk=min(kkk,bz[now]+by[i]-a[now][i]);
}
}
}
return false;
}
void km(){
for(int i=1;i<=n;i++){
while(1){
kkk=1e10;
for(int j=1;j<=n;j++)
visz[j]=0,visy[j]=0;
if(dfs(i)==true)
break;
for(int j=1;j<=n;j++){
if(visy[j]==1)
kkk=min(kkk,upd[j]);
}
for(int j=1;j<=n;j++){
if(visz[j]==1)
bz[j]-=kkk;
if(visy[j]==1)
by[j]+=kkk;
}
}
}
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int k;
cin>>k;
a[j][i]*=k;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
bz[i]=max(bz[i],a[i][j]);
by[i]=0;
}
}
km();
for(int i=1;i<=n;i++)
ans+=a[fd[i]][i];
cout<<ans;
return 0;
}
/*
3
10 2 3
2 3 4
3 4 5
2 2 2
3 5 3
4 5 1
*/