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 |
Re:ac的意想不到,挺高兴的,只可惜思路不是自己的,附代码In Reply To:ac的意想不到,挺高兴的,只可惜思路不是自己的,附代码 Posted by:tiaoer at 2012-09-12 09:32:37 > > // Accepted 808K 391MS C++ 2314B 2012-09-12 09:27:43 > #include<stdio.h> > #include<stdlib.h> > #include<string.h> > #define inf 10000000 > struct node > { > int u,v,w; > }edge[40010]; > int n,p,t,vist[210],opt[210],cf[210][210],dui[210]; > void creat(int l) > { > int i; > memset(cf,0,sizeof(cf)); > for(i=1;i<=l;i++) > { > cf[edge[i].u][edge[i].v]++; > cf[edge[i].v][edge[i].u]=cf[edge[i].u][edge[i].v]; > } > return; > } > int bfs() > { > memset(vist,0,sizeof(vist)); > memset(opt,0,sizeof(opt)); > int rear=0,front=0,x,i; > opt[1]=0; > vist[1]=1; > dui[rear]=1; > front++; > while(rear!=front) > { > x=dui[rear]; > rear++; > for(i=1;i<=n;i++) > { > if(vist[i]==0&&cf[x][i]>0) > { > vist[i]=1; > dui[front]=i; > front++; > opt[i]=opt[x]+1; > } > } > } > if(vist[n]==1) > { > return 1; > } > else > { > return 0; > } > } > int flow; > int min(int a,int b) > { > if(a<b) return a; > else return b; > } > int dfs(int x,int cp) > { > int i,tem,cmp; > tem=cp; > if(x==n) > { > > flow+=cp; > return cp; > } > for(i=1;i<=n;i++) > { > if(opt[x]==opt[i]-1&&cf[x][i]>0) > { > cmp=dfs(i,min(cf[x][i],tem)); > cf[x][i]-=cmp; > cf[i][x]+=cmp; > tem-=cmp; > } > } > return cp-tem; > } > int dinic() > { > int zf=0; > while(bfs()) > { > flow=0; > dfs(1,inf); > zf+=flow; > } > return zf; > } > int cmp(const void *a,const void *b) > { > struct node *x=(node *)a; > struct node *y=(node *)b; > return (x->w)-(y->w); > } > int main() > { > int i,j,right,left,mid,high,liu; > scanf("%d%d%d",&n,&p,&t); > for(i=1;i<=p;i++) > { > scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); > } > qsort(edge+1,p,sizeof(struct node),cmp); > /*for(i=1;i<=p;i++) > { > printf("%d %d %d\n",edge[i].u,edge[i].v,edge[i].w); > }*/ //correct > left=1; > right=p; > high=inf; > while(left<=right) > { > mid=(left+right)/2; > creat(mid); > liu=dinic(); > if(liu>=t) > { > if(edge[mid].w<high) > { > high=edge[mid].w; > } > right=mid-1; > } > else > { > left=mid+1; > } > } > printf("%d\n",high); > return 0; > } 这个二分边太精辟了!少做很多次流,构图也快些 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator