1532 Drainage Ditches (网络流入门)

来源:互联网 发布:木工制图软件 编辑:程序博客网 时间:2024/06/05 04:35

裸题很愉快、模版还不是最好的

#include<stdio.h>#include<algorithm>#include<iostream>#include<vector>#include<queue>using namespace std;#define maxn 500struct Edge{    int from,to,cap,flow;};int n,m,s,t;vector<Edge>edges;vector<int> G[maxn];int vis[maxn],d[maxn],cur[maxn];void init(){    edges.clear();    for(int i=0;i<=t;i++){G[i].clear();}}int bfs(){    memset(vis,0,sizeof vis);    queue<int>q;    q.push(s);    d[s]=0;    vis[s]=1;    while(!q.empty())    {        int x=q.front();        q.pop();        for(int i=0;i<G[x].size();++i)        {            Edge &e=edges[G[x][i]];            if(!vis[e.to]&&e.cap>e.flow)            {                vis[e.to]=1;                d[e.to]=d[x]+1;                q.push(e.to);            }        }    }    return vis[t];}void addEdge(int from,int to,int cap){    edges.push_back((Edge){from,to,cap,0});    edges.push_back((Edge){to,from,0,0});    m=(int)edges.size();    G[from].push_back(m-2);    G[to].push_back(m-1);    }int dfs(int x,int a){    if(x==t||a==0) return a;    int flow=0,f;    for(int& i=cur[x];i<G[x].size();++i)    {        Edge& e=edges[G[x][i]];        if(d[x]+1==d[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0)        {            e.flow+=f;            edges[G[x][i]^1].flow-=f;            flow+=f;            a-=f;            if(a==0) break;        }    }    return flow;}int maxflow(int s,int t){    int flow =0;    while(bfs())    {        memset(cur,0,sizeof cur);        flow+=dfs(s,99999999);    }    return flow;}int main(){    int tt;    while(~scanf("%d%d",&tt,&t))      {        s=1;                for(int i=0;i<tt;i++)        {            int from,to,cap;            scanf("%d%d%d",&from,&to,&cap);            addEdge(from,to,cap);        }        printf("%d\n",maxflow(s,t));        init();    }}


0 0