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