???????????

???????ù????????????·?????????????(????????)???????????б??????????????????????????????????·??????

????1????????

??????????????У?????????????????δ??????????????????????δ?????????????????ù???????????б???????????δ??????????????????????????????????????????????????(????????μ?????????????????????????????????γ?????????????)???????н????????????????в????(??????????)??????????(????????????????)???????????????????

????2??????????

????????????п????????????????????????????????·?????????е?????????????????????????????????????????????????б??????????????????????????

??????????


#include <iostream>
#include <queue>
using namespace std;

const int Maxn=100; //????????
int pre[Maxn]; //???????????????
int v[Maxn]; //?????????????????
int g[Maxn][Maxn]; //???????????
int f[Maxn][Maxn]; //??????????????

//??С??????
int min(const int val1??const int val2)
{
 return val1<val2 ?val1:val2;
}


//???ù??????????(??????洢)
int maxFlow()
{
 int n=0; //n????????
 //?????
 memset(v??0??sizeof(v));
 memset(f??0??sizeof(f));
 cin>>n;

 int s=0??t=n-1; //s????t????
 for(int i=0;i<n;++i)
  for(int j=0;j<n;++j)
   cin>>g[i][j];

 int queTop=0; //???е?????
 while(true)
 {
  memset(pre??int(-1)??sizeof(pre));

  queue<int> que;
  pre[s]=s;
  v[s]=0x7fffffff; //?????????
  que.push(s);

  //?ù?????????????????????·
  while(!que.empty())
  {
   //??????????
   queTop=que.front();
   que.pop();

   for(int i=0;i<n;++i)
   {
    if(pre[i]<0) //С??0???????????
    {
     //?????
     if(g[queTop][i]>f[queTop][i])
     {
      v[i]=min(g[queTop][i]-f[queTop][i]??v[queTop]); //???????????????
      pre[i]=queTop; //???????
      que.push(i);

     }
     //?????
     if(f[i][queTop]>0)
     {
      v[i]=min(f[i][queTop]??v[queTop]);
      pre[i]=queTop+n; //?????pre??????????queTop???n??????????????
         //?ж???????????????
      que.push(i);
     }
    }
   }
   //??????????????????????????????????????????????????
   if(pre[t]>=0) break;
  }

  if(pre[t]<0) break; //????????????·????????????????
 

  //????????????
  int p=0??q=t;
  int minval=v[t];
  //??????????minval???е???
  while(q!=s)
  {
   p=pre[q];
  
   if(p>=n)
   {
    p-=n;
    f[q][p]-=minval;//???????????????
   }
   else
    f[p][q]+=minval;//????????????????
   q=p;
  }
 }

 //????????????
 queTop=0;
 for(int i=0;i<n;++i)
  queTop+=f[s][i];
 return queTop;
}

int main()
{
 cout<<maxFlow()<<endl;
}

????????http://blog.csdn.net/iqrocket/article/details/8350558