#include <stdio.h>  
    #include <string.h>  
    #define INF 2100000000  
    #define MAXN 301  
      
    int SAP(int map[][MAXN],int v_count,int s,int t)      //  
    {  
        int i;  
        int cur_flow,max_flow,cur,min_label,temp;         //  
char flag;                                        //  
int cur_arc[MAXN],label[MAXN],neck[MAXN];         //  
int label_count[MAXN],back_up[MAXN],pre[MAXN];    //icur_flow,  
      
        //  
        memset(label,0,MAXN*sizeof(int));  
        memset(label_count,0,MAXN*sizeof(int));  
      
        memset(cur_arc,0,MAXN*sizeof(int));  
        label_count[0]=v_count;                           //0  
      
        neck[s]=s;  
        max_flow=0;  
        cur=s;  
        cur_flow=INF;  
      
        //  
while(label[s]<v_count)  
        {  
            back_up[cur]=cur_flow;  
            flag=0;  
      
            //  
for(i=cur_arc[cur];i<v_count;i++)    //  
            {  
               if(map[cur][i]!=0&&label[cur]==label[i]+1)    //  
               {  
                   flag=1;  
                   cur_arc[cur]=i;    //  
if(map[cur][i]<cur_flow)    //  
                   {  
                       cur_flow=map[cur][i];  
                       neck[i]=cur;     //  
                   }  
                   else  
                   {  
                       neck[i]=neck[cur];     //  
                   }  
                   pre[i]=cur;    //  
                   cur=i;  
                   if(i==t)    //  
                   {  
                       max_flow+=cur_flow;    //  
      
                       //  
while(cur!=s)  
                       {  
                           if(map[pre[cur]][cur]!=INF)map[pre[cur]][cur]-=cur_flow;  
                           back_up[cur] -= cur_flow;  
                           if(map[cur][pre[cur]]!=INF)map[cur][pre[cur]]+=cur_flow;  
                           cur=pre[cur];  
                       }  
      
                       //  
                       cur=neck[t];  
                       cur_flow=back_up[cur];   
                   }  
                   break;  
               }  
            }  
            if(flag)continue;  
      
            min_label=v_count-1;    //min_label-1  
      
            //     
for(i=0;i<v_count;i++)  
            {  
                if(map[cur][i]!=0&&label[i]<min_label)  
                {  
                    min_label=label[i];  
                    temp=i;  
                }  
            }  
            cur_arc[cur]=temp;    //  
            label_count[label[cur]]--;    //  
if(label_count[label[cur]]==0)break;    //GAP  
            label[cur]=min_label+1;    //  
            label_count[label[cur]]++;     //  
if(cur!=s)  
            {  
               //  
               cur=pre[cur];  
               cur_flow=back_up[cur];  
            }  
        }  
        return(max_flow);  
    }