Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
AC#include<cstdio> #include<cstring> typedef long long LL; const LL N=2005; const LL M=50005; LL MAX=0; int n,m,st1,ed1; int A[N],B[N]; LL map[N][N]; struct qq { int x,y; int other; LL z; int last; }; qq s[M*2]; int num=0,last[N]; int h[N]; int q[N];//循环队列 LL min (LL x,LL y) { if (x==-1) return y; if (y==-1) return x; return x<y?x:y; } bool bt () { memset(h,0,sizeof(h)); int st=1,ed=2; q[st]=st1;h[st1]=1; while (st!=ed) { int x=q[st]; for (int u=last[x];u!=-1;u=s[u].last) { int y=s[u].y; if (s[u].z>0&&h[y]==0) { h[y]=h[x]+1; q[ed]=y; ed++; if (ed>=N) ed=1; } } st++; if (st>=N) st=1; } // for (int u=1;u<=ed1;u++) printf("%d ",h[u]); if (h[ed1]==0) return false; return true; } LL find (int x,LL f) { //printf("YES"); if (x==ed1) return f; LL s1=0,t; for (int u=last[x];u!=-1;u=s[u].last) { int y=s[u].y; if (s[u].z>0&&h[y]==(h[x]+1)&&s1<f) { t=find(y,min(s[u].z,f-s1)); s1+=t; s[u].z-=t; s[s[u].other].z+=t; } } if (s1==0) h[x]=0; return s1; } int init1 (int x,int y,LL z) { num++; s[num].x=x; s[num].y=y; s[num].z=z; s[num].last=last[x]; last[x]=num; return num; } void init (int x,int y,LL z) { int num1=init1(x,y,z),num2=init1(y,x,0); s[num1].other=num2; s[num2].other=num1; } LL check (LL x) { num=0;memset(last,-1,sizeof(last)); for (int u=1;u<=n;u++) init(st1,u,A[u]); for (int i=1;i<=n;i++) init(i+n,ed1,B[i]); for (int u=1;u<=n;u++) init(u,u+n,MAX); for (int u=1;u<=n;u++) for (int i=1;i<=n;i++) if (map[u][i]!=-1&&map[u][i]<=x) init(u,i+n,MAX); /*printf("%d",num); printf("======================="); for (int u=1;u<=num;u++) printf("%d %d %I64d\n",s[u].x,s[u].y,s[u].z); printf("======================="); getchar();getchar();*/ LL ans=0; while (bt()==true) ans=ans+find(st1,MAX); return ans; } int main() { memset(map,-1,sizeof(map)); scanf("%d%d",&n,&m); st1=2*n+1;ed1=st1+1; for (int u=1;u<=n;u++) { scanf("%d%d",&A[u],&B[u]); MAX+=A[u]; } for (int u=1;u<=m;u++) { int x,y; LL z; scanf("%d%d%I64d",&x,&y,&z); /*printf("z:%I64d\n",z); printf("%I64d %I64d\n",map[x][y],z);*/ map[x][y]=min(map[x][y],z); map[y][x]=map[x][y]; } for (int k=1;k<=n;k++) { for (int u=1;u<=n;u++) { if (u==k) continue; for (int i=1;i<=n;i++) { if (i==u||i==k) continue; if (map[u][k]==-1||map[k][i]==-1) continue; map[u][i]=min(map[u][i],map[u][k]+map[k][i]); } } } /*for (int u=1;u<=n;u++) { for (int i=1;i<=n;i++) printf("%I64d ",map[u][i]); printf("\n"); }*/ LL l=1,r,ans=-1,mid; r=LL(1000000000)*LL(n); while(l<=r) { mid=(l+r)/2; if(check(mid)==MAX) { r=mid-1; ans=mid; } else l=mid+1; } printf("%I64d\n",ans); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator