1.BFS+DFS
int c[201][201],pre[201],queue[201],dis[201];
//c为流地图
bool vis[201];
int n,m,ans;
inline int find_min(int a,int b)
{
return a<b?a:b;
}
void dfs(int s)
//s为开头节点
{
if (!c[pre[s]][s] && s!=1) return ;
if (s==n)
{
int i,flow=0xFFFFFFF;
i=n;
while (i!=1)
{
flow=find_min(flow,c[pre[i]][i]);
i=pre[i];
}
ans+=flow;
i=n;
while (i!=1)
{
c[pre[i]][i]-=flow;
c[i][pre[i]]+=flow;
i=pre[i];
}
}
for (int i=1;i<=n;i++)
if (c[pre[s]][s]>0 || s==1)
if (c[s][i]>0 && dis[i]==dis[s]+1)
{
pre[i]=s; dfs(i);
}
}
bool bfs() //如果还存在增广路
{
int head,tail,now;
for (int i=1;i<=n;i++)
{
dis[i]=0; vis[i]=false;
}
queue[1]=1; vis[1]=true;
head=tail=1;
while (head<=tail)
{
now=queue[head];
for (int i=1;i<=n;i++)
if (!vis[i] && c[now][i]>0)
{
vis[i]=true;
tail++; queue[tail]=i;
dis[i]=dis[now]+1;
}
head++;
}
return vis[n];
}
执行:while(bfs())dfs(开头节点编号)
2.纯BFS
int c[201][201],pre[201],queue[201];
bool vis[201];
int n,m,ans;
inline int find_min(int a,int b)
{
return a<b?a:b;
}
void change()
{
int i,flow=0xFFFFFFF;
i=n;
while (i!=1)
{
flow=find_min(flow,c[pre[i]][i]);
i=pre[i];
}
ans+=flow;
i=n;
while (i!=1)
{
c[pre[i]][i]-=flow;
c[i][pre[i]]+=flow;
i=pre[i];
}
}
bool bfs()
{
for (int i=1;i<=n;i++)
{
vis[i]=false; pre[i]=0;
}
int head=1,tail=1,now;
vis[1]=true; queue[1]=true;
while (head<=tail)
{
now=queue[head];
for (int i=1;i<=n;i++)
if (!vis[i] && c[now][i]>0)
{
vis[i]=true;
tail++;
queue[tail]=i; pre[i]=now;
}
head++;
}
return vis[n];
}
执行:while(bfs())change()