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 |
又囧了……原来它是无向图,原来它的重边不可合并! #include<cstdio> using namespace std; const int NMax=210,PMax=40100; struct node { int num,len; node *next,*rev; }*A[NMax],pool[PMax*4]; int N,nn,L,P,T,F[NMax][NMax]; void Build(int x,int y,int z) { node *p=&pool[L++],*q=&pool[L++]; p->num=y;p->len=z;p->next=A[x];A[x]=p;p->rev=q; q->num=x;q->len=0;q->next=A[y];A[y]=q;q->rev=p; } int level[NMax],q[NMax]; bool makelevel() { for(int i=1;i<=nn;i++) level[i]=-1; level[0]=0;q[0]=0; for(int i=0,bot=1;i<bot;i++) { int x=q[i]; for(node *p=A[x];p;p=p->next) if(p->len&&level[p->num]==-1) level[q[bot++]=p->num]=level[x]+1; } return level[nn]!=-1; } inline int min(int a,int b) {return a<b?a:b;} int Find(int a,int alpha) { if(a==nn) return alpha; int tot=0,tmp; for(node *p=A[a];p&&tot<alpha;p=p->next) { if(p->len&&level[p->num]==level[a]+1) { if(tmp=Find(p->num,min(alpha-tot,p->len))) { tot+=tmp; p->len-=tmp; p->rev->len+=tmp; } } } if(!tot) level[a]=-1; return tot; } int X[PMax],Y[PMax],Z[PMax]; int main() { int x,y,z,ZMax=0; scanf("%d%d%d",&N,&P,&T); for(int i=1;i<=P;i++) { scanf("%d%d%d",X+i,Y+i,Z+i); if(Z[i]>ZMax) ZMax=Z[i]; } x=0;y=ZMax+10; nn=N; int ans=100000000; while(x<=y) { if(x+1==y) break; int mid=(x+y)>>1; L=0; for(int i=0;i<=nn;i++) A[i]=NULL; Build(0,1,T); int Maxa=0; for(int i=1;i<=P;i++) if(Z[i]<=mid) {Build(X[i],Y[i],1);Build(Y[i],X[i],1);if(Z[i]>Maxa) Maxa=Z[i];} int ret=0,tmp; while(makelevel()) while(tmp=Find(0,100000000)) ret+=tmp; if(ret>=T) {y=mid;if(Maxa<ans)ans=Maxa;} else x=mid; } printf("%d\n",ans); getchar();getchar(); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator