我又来这题了(
查看原帖
我又来这题了(
380579
BMTXLRC楼主2021/7/3 11:16

44pts,用别人号交的,求查

AC WA TLE MLE RE都有(

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3305;
const int M=6e5+5;
const int inf=1e18;
int n,m,dis[N][N],cow[M],have[M],a[N][N],slack[M],f[M],p[M],lx[M],ly[M],dfn[M],id=1,ans=1e18,cntx,cnty,sum[M];
void bfs(int k){
	int x=0,delta=0,s=0,y=0;
	memset(slack,0x3f,sizeof(slack));
	slack[0]=0;
	memset(p,0,sizeof(p));
	f[y]=k;
	while(1){
		x=f[y],delta=inf,dfn[y]=id;
		for(register int i=1;i<=cntx;i++){
			if(dfn[i]==id) continue;
			if(slack[i]>lx[x]+ly[i]-a[x][i]){
				slack[i]=lx[x]+ly[i]-a[x][i];
				p[i]=y;
			}
			if(slack[i]<delta) delta=slack[i],s=i;
		}
		for(register int i=0;i<=cntx;i++){
			if(dfn[i]==id) lx[f[i]]-=delta,ly[i]+=delta;
			else slack[i]-=delta;
		}
		y=s;
		if(f[y]==-1) break;
	}
	while(y) f[y]=f[p[y]],y=p[y];
}
int KM(){
	for(register int i=1;i<=cntx;i++) f[i]=-1;
	for(register int i=1;i<=cntx;i++,id++) bfs(i);
	for(register int i=1;i<=cntx;i++) if(a[f[i]][i]<=1e18) ans=min(ans,a[f[i]][i]);
	return ans;
}
signed main(){
	scanf("%lld %lld",&n,&m);
	for(register int i=1;i<=n;i++){
		scanf("%lld %lld",&cow[i],&have[i]);
		sum[i]=sum[i-1]+have[i];
		cnty+=have[i];
	}
	for(register int i=1;i<=n;i++){
		for(register int j=1;j<=n;j++) dis[i][j]=1e18;
		dis[i][i]=0;
	}
	for(register int i=1,x,y,z;i<=m;i++){
		scanf("%lld %lld %lld",&x,&y,&z);
		dis[x][y]=min(dis[x][y],z);
		dis[y][x]=min(dis[y][x],z);
	}
	for(register int k=1;k<=n;k++){
		for(register int i=1;i<=n;i++){
			for(register int j=1;j<=n;j++){
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
			}
		}
	}
	for(register int i=1;i<=n;i++){
		for(register int j=1;j<=cow[i];j++){
			cntx++;
			for(register int k=1;k<=n;k++){
				for(register int l=1;l<=have[k];l++){
					a[cntx][sum[k-1]+l]=-dis[i][k];
				}
			}
		}
	}
	if(cntx>cnty){
		printf("-1");
		return 0;
	}
	int l=-KM();
	if(l>=1e18){
		printf("-1");
		return 0;
	}
	printf("%lld",l);
}
2021/7/3 11:16
加载中...