rt
TLE、RE都行,MLE真的不能理解...
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int INF=2e9;
const int M=505;
int n,m,s,t,ans,tot=1,ret,cnt,k,tim;
int head[N],now[N],dis[N];
int tt[M][M],w[M][M];
bool vis[N];
struct edge{
int w,c,to,nxt;
}e[N*10];
struct node{
int a,b,s,t,c;
}q[N];
inline void add(int u,int v,int w,int c){
e[++tot].w=w;
e[tot].c=c;
e[tot].to=v;
e[tot].nxt=head[u];
head[u]=tot;
}
inline void addedge(int u,int v,int w,int c){
add(u,v,w,c),add(v,u,0,-c);
}
bool spfa(){
for(int i=0;i<=t;i++)dis[i]=-INF,vis[i]=0;
queue <int> q;
q.push(s);
dis[s]=0,vis[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w,c=e[i].c;
if(w&&dis[v]<dis[u]+c){
dis[v]=dis[u]+c;
if(!vis[v])q.push(v),vis[v]=1;
}
}
}
return dis[t]!=-INF;
}
int dfs(int u,int sum){
int res=0;
if(u==t)return sum;
vis[u]=cnt;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w,c=e[i].c;
if((vis[v]!=cnt||v==t)&&dis[v]==dis[u]+c&&w){
int num=dfs(v,min(sum-res,w));
if(!num)continue;
e[i].w-=num,e[i^1].w+=num;
res+=num,ret+=num*c;
if(res==sum)break;
}
}
return res;
}
int mcmf(){
int res=0;
while(spfa()){
do{
cnt++,res+=dfs(s,INF);
}while(vis[t]==cnt);
}
return res;
}
signed main(){
scanf("%d%d%d%d",&n,&m,&k,&tim);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&tt[i][j]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&w[i][j]);
s=m*2+5,t=m*2+10;
for(int i=1;i<=m;i++)
scanf("%d%d%d%d%d",&q[i].a,&q[i].b,&q[i].s,&q[i].t,&q[i].c);
for(int i=1;i<=m;i++){
addedge(i*2-1,i*2,1,q[i].c);
if(q[i].t+tt[q[i].b][0]<=tim)addedge(i*2,t,INF,-w[q[i].b][0]);
else continue;
if(tt[0][q[i].a]<=q[i].s)addedge(s+1,i*2-1,INF,-w[0][q[i].a]);
for(int j=1;j<=m;j++){
if(q[i].t+tt[q[i].b][q[j].a]<=q[j].s)
addedge(i*2,j*2-1,INF,-w[q[i].b][q[j].a]);
}
}
addedge(s,s+1,k,0);
ans=mcmf();
printf("%d",ret);
return 0;
}
//Dinic