最大流算法魔板

来源:互联网 发布:基金从业考试题型 知乎 编辑:程序博客网 时间:2024/05/05 03:28
//最大流算法魔板struct Edge{    int from,to,cap,flow;    Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}};vector<Edge>edge;vector<int>G[maxn];int n,s,t;//n个点,源点标号s,汇点t //EK专用:============================================================================== int a[maxn];int p[maxn]; //====================================================================================== //Dinicz专用:============================================================================ bool vis[maxn];int d[maxn];int cur[maxn];//======================================================================================void init(int n){    for(int i=0;i<n;i++)G[i].clear();    edge.clear();}void add_edge(int from,int to,int cap){    edge.push_back(Edge(from,to,cap,0));    edge.push_back(Edge(to,from,0,0));    int lm=edge.size();    G[from].push_back(lm-2);    G[to].push_back(lm-1);}//Efmonds_Karpint maxflow(int s,int t){    int flow=0;    while(1)    {        memset(a,0,sizeof(a));        queue<int>Q;        Q.push(s);        a[s]=inf;        while(!Q.empty())        {            int x=Q.front();Q.pop();            for(int i=0;i<G[x].size();i++)            {                Edge& e=edge[G[x][i]];                if(!a[e.to]&&e.cap>e.flow)                {                    p[e.to]=G[x][i];                    a[e.to]=min(a[x],e.cap-e.flow);                    Q.push(e.to);                }            }            if(a[t])break;        }        if(!a[t])break;        for(int u=t;u!=s;u=edge[p[u]].from)        {            edge[p[u]].flow+=a[t];            edge[p[u]^1].flow-=a[t];        }        flow+=a[t];    }    return flow;}//Dinicbool 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=edge[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];}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=edge[G[x][i]];        if(d[x]+1==d[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0)        {            e.flow+=f;            edge[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,inf);    }    return flow;}

用 POJ - 1459 Power Network 测试了一下,EK 1407ms,Dinic 125ms。

未完待续····

原创粉丝点击