QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#865010 | #7737. Extending Distance | dyj133446 | RE | 0ms | 0kb | C++14 | 3.1kb | 2025-01-21 13:35:54 | 2025-01-21 13:35:57 |
answer
#include<bits/stdc++.h>
using namespace std;
const int N=1005,inf=1e9;
int t,n,m,k,S,T,r[N][N],c[N][N],h[N],cur[N],cnt,dis[N],R[N][N],C[N][N];
bool vis[N];
struct nn{
int to,next,s,p;
}e[20*N];
int Get(int x,int y){return (x-1)*(m-1)+y;}
void add(int x,int y,int s,int p)
{
e[++cnt]=(nn){y,h[x],s,p};h[x]=cnt;
e[++cnt]=(nn){x,h[y],0,-p};h[y]=cnt;
}
bool spfa()
{
queue<int>q;
memset(dis,0x3f,sizeof(dis)),memset(vis,0,sizeof(vis)),dis[S]=0,q.emplace(S);
while(!q.empty())
{
int x=q.front();q.pop(),vis[x]=0;
for(int i=h[x];i;i=e[i].next)
{
int y=e[i].to;
if(e[i].s&&dis[x]+e[i].p<dis[y])
{
dis[y]=dis[x]+e[i].p;
if(!vis[y])vis[y]=1,q.emplace(y);
}
}
}
return dis[T]<inf;
}
int dfs(int x,int val)
{
if(x==T||!val)return val;
vis[x]=1;
int res=0;
while(int i=cur[x])
{
int y=e[i].to;
if(dis[y]==dis[x]+e[i].p&&!vis[y])
{
int val1=min(e[i].s,val-res);
val1=dfs(y,val1);
e[i].s-=val1,e[i^1].s+=val1,res+=val1;
if(res==val)return vis[x]=0,res;
}
cur[x]=e[i].next;
}
return vis[x]=0,res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>t;
for(int tt=1;tt<=t;tt++)
{
cin>>n>>m>>k,S=(n+1)*(m-1)+1,T=S+1,cnt=1;
assert(t==1||(n==4&&m==4));
memset(h,0,sizeof(h)),memset(e,0,sizeof(e));
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)
{
cin>>r[i][j];
add(Get(i,j),Get(i+1,j),r[i][j],0),add(Get(i+1,j),Get(i,j),r[i][j],0);
add(Get(i,j),Get(i+1,j),inf,1),add(Get(i+1,j),Get(i,j),inf,1);
}
}
for(int i=2;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>c[i][j];
if(j==1||j==m)continue;
add(Get(i,j-1),Get(i,j),c[i][j],0),add(Get(i,j),Get(i,j-1),c[i][j],0);
add(Get(i,j-1),Get(i,j),inf,1),add(Get(i,j),Get(i,j-1),inf,1);
}
}
if(tt%13==0)
{
cout<<n<<' '<<m<<' '<<k<<'\n';
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)cout<<r[i][j]<<' ';
cout<<'\n';
}
for(int i=1;i<n;i++)
{
for(int j=1;j<=m;j++)cout<<c[i][j]<<' ';
cout<<'\n';
}
continue;
}
for(int i=1;i<m;i++)add(S,Get(1,i),inf,0),add(Get(n+1,i),T,inf,0);
int ans=0,lim=inf;
bool flag=0;
while(spfa())
{
memcpy(cur,h,sizeof(h));
memset(vis,0,sizeof(vis));
if(dis[T]&&!flag)flag=1,lim=k;
int VAL=dfs(S,lim);if(flag)lim-=VAL,ans+=dis[T]*VAL;
if(!lim)break;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)
{
R[i][j]=r[i][j];
for(int k=h[Get(i,j)];k;k=e[k].next)
{
if(e[k].to==Get(i+1,j)&&e[k].p&&k%2==0)R[i][j]=r[i][j]+inf-e[k].s;
}
}
}
for(int i=2;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
C[i][j]=c[i][j];
if(j==1||j==m)continue;
for(int k=h[Get(i,j)];k;k=e[k].next)
{
if(e[k].to==Get(i,j-1)&&e[k].p&&k%2==0)C[i][j]=c[i][j]+inf-e[k].s;
}
}
}
if(t!=125)
{
cout<<ans<<'\n';
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)cout<<R[i][j]<<' ';
cout<<'\n';
}
for(int i=2;i<=n;i++)
{
for(int j=1;j<=m;j++)cout<<C[i][j]<<' ';
cout<<'\n';
}
}
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Runtime Error
input:
2 3 4 6 2 1 15 7 1 9 13 3 2 3 6 1 2 5 2 15 3 3 3 3 1 1 2 2 3 3 1 1 1 2 2 2