网络流:
bool bfs()//建层次图
{
int i,temp;deque<int> Q;
Q.push_back(0);memset(dist,-1,sizeof(dist));
dist[0]=0;
while(!Q.empty())
{
temp=Q.at(0);Q.pop_front();
for(i=0;i<=N+1;i++)
{
if(map[temp][i]>0&&dist[i]==-1)
{
dist[i]=dist[temp]+1;
Q.push_back(i);
}
}
}
if(dist[N+1]==-1)
return 0;
return 1;
}
int dinic(int x,int low)
{
int temp;
if(x==N+1)
return low;
for(int i=0;i<=N+1;i++)
{
if(map[x][i]>0&&dist[i]==dist[x]+1&&(temp=dinic(i,min(low,map[x][i]))))
{
map[x][i]-=temp;
map[i][x]+=temp;
return temp;
}
}
return 0;
}
while(bfs())
{
while(P=dinic(0,INF))
ans+=P;
}