| ||||||||||
| 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:广搜寻找增广路径为什么总是超时呢?附代码,拜托哪位大牛指点指点In Reply To:广搜寻找增广路径为什么总是超时呢?附代码,拜托哪位大牛指点指点 Posted by:shennong at 2012-08-01 18:34:16 > #include<stdio.h>
> #include<string.h>
> #define inf 100001
> #define max 1000
> #define white 0
> #define black 1
> int cap[max][max];
> int flow[max][max],f[max],father[max],lujing[max];
> int n,dui[100100],s,t;
> int bfs()
> {
> int front,rear,i,number,sum,min,x,y;
> for(;;)
> {
> //printf("linger");
> y=t;
> x=s;
> front=0,rear=0;
> memset(f,white,sizeof(f));
> for(i=0;i<102;i++)
> {
> father[i]=-1;
> }
> father[x]=-1;
> f[x]=black;
> dui[front]=x;
> front++;
> while(rear!=front)
> {
> x=dui[rear];
> rear++;
> for(i=0;i<=n+1;i++)
> {
> if(cap[x][i]>0&&f[i]==white)
> {
> dui[front]=i;
> f[i]=black;
> front++;
> father[i]=x;
> }
> }
> if(f[t]==black)
> break;
> }
>
> if(father[y]==-1)
> {
> break;
> }
> number=0;
> lujing[number]=y;
> while(father[y]!=-1)
> {
> number++;
> lujing[number]=father[y];
> y=father[y];
> }//经过这个循环,路径已经存在于lujing数组里,数组里记录的是顶点
> min=inf;
> for(i=0;i<number;i++)
> {
> if(cap[lujing[i+1]][lujing[i]]<min)
> {
> min=cap[lujing[i+1]][lujing[i]];
> }
> }
> for(i=0;i<number;i++)
> {
> flow[lujing[i+1]][lujing[i]]+=min;
> flow[lujing[i]][lujing[i+1]]=0-(flow[lujing[i+1]][lujing[i]]);
> }
> for(i=0;i<number;i++)
> {
> cap[lujing[i+1]][lujing[i]]=cap[lujing[i+1]][lujing[i]]-min;
> //反向还有变化,待续;
> //cap[lujing[i]][lujing[i+1]]+=flow[lujing[i]][lujing[i+1]];
> cap[lujing[i]][lujing[i+1]]=cap[lujing[i]][lujing[i+1]]-min;
> }
>
> }
> sum=0;
> for(i=0;i<n;i++)
> {
> if(flow[i][y]>0)
> {
> sum=sum+flow[i][y];
> }
> }
> return sum;
>
>
> }
> int main()
> {
> int np,nc,m,i,j;
> int d1,d2,d3,d4,d5,d6,d7;
> for(;scanf("%d %d %d %d",&n,&np,&nc,&m)!=EOF;)
> {
> getchar();
> s=n;
> t=n+1;
> memset(cap,0,sizeof(cap));
> memset(flow,0,sizeof(flow));
> for(i=0;i<m;i++)
> {
> scanf("(%d,%d)%d ",&d1,&d2,&d3);
> //getchar();
> if(d1==d2) continue;
> cap[d1][d2]=d3;
> }
> for(i=0;i<np;i++)
> {
>
> scanf("(%d)%d ",&d4,&d5);
> //getchar();
> cap[s][d4]=d5;//n是源点
> }
> for(i=0;i<nc;i++)
> {
> scanf("(%d)%d",&d6,&d7);
> if(i<nc-1) getchar();
> cap[d6][t]=d7;//n+1是汇点
> }
>
> //printf("\n\n");
> printf("%d\n",bfs());
> }
> return 0;
> }
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator