比赛 cdcqの省选膜你赛 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 源符「厌川的翡翠」 最终得分 100
用户昵称 cdcq 运行时间 3.060 s
代码语言 C++ 内存使用 28.44 MiB
提交时间 2017-04-11 08:02:52
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int oo=168430090;
int rd(){int z=0,mk=1;  char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')mk=-1;  ch=getchar();}
	while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
	return z*mk;
}
struct ddd{int nxt,y,v,rvs;}e[510000];  int lk[310000],ltp=0;
inline void ist(int x,int y,int z){
	e[++ltp].nxt=lk[x],lk[x]=ltp,e[ltp].y=y,e[ltp].v=z,e[ltp].rvs=ltp+1;
	e[++ltp].nxt=lk[y],lk[y]=ltp,e[ltp].y=x,e[ltp].v=0,e[ltp].rvs=ltp-1;
}
ddd E[21000];  int LK[110000],LTP=0;
inline void IST(int x,int y){  E[++LTP].nxt=LK[x],LK[x]=LTP,E[LTP].y=y;}
int n,m,w,v,a[2100][2100];
int s,t;
int lvl[210000];
int q[210000],hd=0;
bool gtlvl(){
	memset(lvl,0,sizeof(lvl));
	q[hd=1]=s,lvl[s]=1;
	for(int k=1;k<=hd;++k)for(int i=lk[q[k]];i;i=e[i].nxt)
		if(e[i].v && !lvl[e[i].y])  lvl[e[i].y]=lvl[q[k]]+1,q[++hd]=e[i].y;
	return lvl[t];
}
int mxflw(int x,int y){
	//cout<<x<<" "<<y<<endl;
	if(x==t)  return y;
	int bwl=0,flw;
	for(int i=lk[x];i && bwl<y;i=e[i].nxt)if(e[i].v && lvl[e[i].y]==lvl[x]+1)
		if((flw=mxflw(e[i].y,min(y-bwl,e[i].v)))){
			bwl+=flw;
			e[i].v-=flw,e[e[i].rvs].v+=flw;
		}
	if(!bwl)  lvl[x]=0;
	return bwl;
}
int dnc(){
	int bwl=0,flw;
	while(gtlvl())while((flw=mxflw(s,oo)))  bwl+=flw;
	return bwl;
}
int gtid(int x,int y){  return (x-1)*(v+1)+y+1;}
void clr(){  memset(lk,0,sizeof(lk)),ltp=0;}
bool chck(int x){
	clr();
	for(int k=1;k<=n;++k){
		ist(s,gtid(k,0),oo),ist(gtid(k,v),t,oo);
		for(int j=1;j<=v;++j)  ist(gtid(k,j-1),gtid(k,j),a[k][j]);
		for(int j=x;j<=v;++j)
			for(int i=LK[k];i;i=E[i].nxt)
				ist(gtid(k,j),gtid(E[i].y,j-x),oo);
	}
	return dnc()<=w;
}
int bnrsch(){
	int l=0,r=v,md;
	while(l+1<r)  md=(l+r)>>1,(chck(md) ? r : l)=md;
	return chck(l) ? l : r;
}
int main(){
	freopen("cdcq_c.in","r",stdin);
	freopen("cdcq_c.out","w",stdout);
	cin>>n>>m>>w>>v;  s=0,t=(n+1)*(v+1)+1;
	int l,r;
	for(int i=1;i<=m;++i)  l=rd(),r=rd(),IST(l,r),IST(r,l);
	for(int i=1;i<=n;++i)for(int j=1;j<=v;++j)  a[i][j]=rd();
	int ans=bnrsch();
	cout<<(ans==v ? -1 : ans)<<endl;
	return 0;
}