MnZn求助10ptsMLE
查看原帖
MnZn求助10ptsMLE
709013
__Inception__楼主2023/2/7 19:35

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
2023/2/7 19:35
加载中...