救救孩子吧 /ll。TLE on #63,不知道怎么卡了。
#include<bits/stdc++.h>
char buf[1<<20],*p1,*p2;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
#pragma GCC target("avx")
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#define il inline
using namespace std;
il int read()
{
int xr=0,F=1; char cr;
while(cr=getchar(),cr<'0'||cr>'9') if(cr=='-') F=-1;
while(cr>='0'&&cr<='9')
xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
return xr*F;
}
const int N=2e4+5,inf=105,Inf=1e9;
int n,m,k,q,s,t;
struct edge{int nxt,to,w;} e[N<<1];
int E[1025][N<<1],ans[1025],lw[N];
int head[N],cnt=1;
il void add(int u,int v,int w)
{
e[++cnt]={head[u],v,w};head[u]=cnt;
e[++cnt]={head[v],u,0};head[v]=cnt;
}
namespace dinic
{
queue<int> q;
int dis[N],now[N];
il bool bfs()
{
for(int i=s;i<=t;i++) dis[i]=inf,now[i]=head[i];
dis[s]=0,q.push(s);
while(!q.empty())
{
int u=q.front(); q.pop();
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(!e[i].w||dis[v]!=inf) continue;
dis[v]=dis[u]+1,q.push(v);
}
}
return dis[t]!=inf;
}
int dfs(int u,int sum)
{
if(u==t) return sum;
int res=0;
for(int i=now[u];i&∑i=e[i].nxt)
{
int v=e[i].to; now[u]=i;
if(!e[i].w||dis[v]!=dis[u]+1) continue;
int k=dfs(v,min(e[i].w,sum));
e[i].w-=k,e[i^1].w+=k;
sum-=k,res+=k;
}
return res;
}
};
namespace EK
{
int vis[N],pre[N],dis[N];
int Vis[N],Pre[N],Dis[N];
int q[N],st=1,ed=0;
il void init()
{
for(int i=1;i<=n;i++) Vis[i]=0,Pre[i]=-1,Dis[i]=inf;
}
il bool bfs()
{
st=1,ed=0;
// memcpy(vis,Vis,sizeof(Vis)),memcpy(pre,Pre,sizeof(Pre)),memcpy(dis,Dis,sizeof(Dis));
for(int i=1;i<=n;i++) vis[i]=0,pre[i]=-1,dis[i]=inf;
q[++ed]=s;
vis[s]=1;
while(st<=ed)
{
int u=q[st];st++;
if(u==t) return 1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to,w=e[i].w;
if(vis[v]||!w) continue;
vis[v]=1,pre[v]=i;
dis[v]=min(dis[u],w);
q[++ed]=v;
if(v==t) return 1;
}
if(vis[t]) return 1;
}
return 0;
}
il int upd()
{
int now=t;
while(now!=s)
{
int i=pre[now];
e[i].w-=dis[t];
e[i^1].w+=dis[t];
now=e[i^1].to;
}
return dis[t];
}
};
int w[N],sum[N];
void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10); putchar(x%10+'0');
}
int main()
{
n=read(),m=read(),k=read(),q=read();
s=1,t=n; EK::init();
for(int i=1;i<=m;i++)
{
int u=read(),v=read(),w=read();
add(u,v,w);
}
for(int i=1;i<(1<<k);i++) lw[i]=__lg(i&-i);
while(dinic::bfs()) ans[0]+=dinic::dfs(s,inf);
for(int i=1;i<=cnt;i++) E[0][i]=e[i].w;
for(int i=1;i<(1<<k);i++)
{
int lst=i-(i&-i),pos=lw[i];
for(int j=1;j<=cnt;j++) e[j].w=E[lst][j];
e[(pos+1)<<1].w=inf;
ans[i]=ans[lst];
while(EK::bfs()) ans[i]+=EK::upd();
for(int j=1;j<=cnt;j++) E[i][j]=e[j].w;
}
while(q--)
{
for(int i=1;i<=k;i++) w[i]=read();
int ans=Inf;
for(int i=1;i<(1<<k);i++) sum[i]=sum[i^(i&-i)]+w[lw[i]+1];
for(int i=0;i<(1<<k);i++)
{
int res=sum[(1<<k)-1^i];
ans=min(ans,res+::ans[i]);
}
write(ans); putchar('\n');
}
return 0;
}