hdu1532 网络流dinic算法模板

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<cmath>
  4 #include<algorithm>
  5 #include<vector>
  6 #include<queue>
  7 #define inf 0x3f3f3f3f
  8 using namespace std;
  9 int min(int xx,int yy)
 10 {
 11     if (xx<yy) return xx;
 12     return yy;
 13 }
 14 struct Edge
 15 {
 16     int from,to,cap,flow;
 17 };
 18 vector<Edge>edges;
 19 vector<int>G[205];
 20 int s,t;
 21 int vis[205],d[205],cur[205];//d[]为层次即距离,cur[]为当前弧下标,vis[]有没有访问过
 22 
 23 void addedge(int from,int to,int cap)
 24 {
 25     Edge edge1,edge2;
 26     edge1.from=from; edge1.to=to; edge1.cap=cap; edge1.flow=0;
 27     edge2.from=to; edge2.to=from; edge2.cap=edge2.flow=0;
 28     edges.push_back(edge1);
 29     edges.push_back(edge2);
 30     int m=edges.size();
 31     G[from].push_back(m-2);
 32     G[to].push_back(m-1);
 33 }
 34 int bfs()
 35 {
 36     memset(vis,0,sizeof(vis));
 37     queue<int>q;
 38     Edge e;
 39     q.push(s);
 40     d[s]=0;
 41     vis[s]=1;
 42     while (!q.empty())
 43     {
 44         int x=q.front();
 45         q.pop();
 46         for (int i=0; i<G[x].size(); i++)
 47         {
 48             Edge& e=edges[G[x][i]];
 49             if (!vis[e.to]&&e.cap>e.flow)
 50             {
 51                 vis[e.to]=1;
 52                 d[e.to]=d[x]+1;
 53                 q.push(e.to);
 54             }
 55         }
 56     }
 57     return vis[t];
 58 }
 59 int dfs(int x,int a)
 60 {
 61     if (x==t||a==0) return a;
 62     int flow=0,f;
 63     Edge e;
 64     for (int& i=cur[x]; i<G[x].size(); i++)
 65     {
 66         Edge& e=edges[G[x][i]];
 67         if (d[x]+1==d[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0)
 68         {
 69             e.flow+=f;
 70             edges[G[x][i]^1].flow-=f;
 71             flow+=f;
 72             a-=f;
 73             if (a==0) break;
 74         }
 75     }
 76     return flow;
 77 }
 78 int main()
 79 {
 80     int flow,i,n,m,p,q,x;
 81     while (~scanf("%d%d",&m,&n))
 82     {
 83         edges.clear();
 84         for (i=1; i<=n; i++) G[i].clear();
 85         for (i=1; i<=m; i++)
 86         {
 87             scanf("%d%d%d",&p,&q,&x);
 88             addedge(p,q,x);
 89         }
 90         s=1;
 91         t=n;
 92         flow=0;
 93         while (bfs())
 94         {
 95             memset(cur,0,sizeof(cur));
 96             flow+=dfs(s,inf);
 97         }
 98         printf("%d\n",flow);
 99     }
100 }

http://acm.hdu.edu.cn/showproblem.php?pid=1532

posted on 2014-08-13 13:40  xiao_xin  阅读(120)  评论(0编辑  收藏  举报

导航