| ||||||||||
| 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