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);
}