1 ///最小费用最大流模板
 2 bool spfa()
 3 {
 4      fill(vs,vs+n+2,false);
 5      fill(d,d+n+2,inf);
 6      fill(father,father+n+2,-1);
 7      queue<int>q;
 8      d[0]=0;
 9      q.push(0);
10      while (!q.empty())
11      {
12          int u=q.front();
13          q.pop();
14          vs[u]=false;
15          for (int i=head[u];i!=-1;i=eage[i].next)
16          {
17              int v=eage[i].v;
18              if (eage[i].cap&&d[v]>d[u]+eage[i].cost)
19              {
20                  d[v]=d[u]+eage[i].cost;
21                  father[v]=i;
22                  if (!vs[v])
23                  {
24                      vs[v]=true;
25                      q.push(v);
26                  }
27              }
28          }
29      }
30      if (father[n+1]==-1) return false;
31      return true;
32 }
33 
34 int solve()
35 {
36     int ans=0;
37     while (spfa())
38     {
39         ans+=d[n+1];
40         int u=n+1;
41         while (u!=0)
42         {
43             int i=father[u];
44             eage[i].cap--;
45             eage[i^1].cap++;
46             u=eage[i].u;
47         }
48     }
49     return ans;
50 }

 

posted on 2016-07-29 20:34  pb2016  阅读(157)  评论(0编辑  收藏  举报