最大流学习hdu3549 && 4920二分图匹配

来源:互联网 发布:tensorflow lite官网 编辑:程序博客网 时间:2024/05/18 13:04

Dinic算法:O(E * V^2)


#include<bits/stdc++.h>using namespace std;const int maxn = 500 + 10;typedef long long ll;#define clr(x,y) memset(x,y,sizeof x)#define INF 0x3f3f3f3fstruct Edge{    Edge(int x,int y,int z):to(x),cap(y),rev(z){}    int to,cap,rev;};vector<Edge>G[maxn];int n,m;void add_edge(int x,int y,int z){    G[x].push_back(Edge(y,z,G[y].size()));    G[y].push_back(Edge(x,0,G[x].size() - 1));}int level[maxn];int iter[maxn];void bfs(int s){    clr(level,-1);    queue<int>q;    q.push(s);    level[s] = 0;    while(!q.empty())    {        int u = q.front();q.pop();        for(int i = 0; i < G[u].size(); i ++)        {            Edge e = G[u][i];            if(e.cap > 0 && level[e.to] < 0)            {                level[e.to] = level[u] + 1;                q.push(e.to);            }        }    }}int dfs(int u,int t,int f){    if(u == t)        return f;    for(int &i = iter[u]; i < G[u].size(); i ++)    {        Edge &e = G[u][i];        if(e.cap > 0 && level[e.to] > level[u])        {            int d = dfs(e.to,t,min(f,e.cap));            if(d > 0)            {                e.cap -= d,G[e.to][e.rev].cap += d;                return d;            }        }    }    return 0;}int max_flow(int s,int t){    int flow =0;    while(true)    {        bfs(s);        if(level[t] < 0)return flow;        clr(iter,0);        int f;        while((f = dfs(s,t,INF)) > 0)            flow += f;    }}int main(){    int Tcase;    scanf("%d",&Tcase);    for(int ii = 1; ii <= Tcase; ii ++)    {        scanf("%d%d",&n,&m);        for(int i = 0; i <= n; i ++)G[i].clear();        for(int i = 1; i <= m; i ++)        {            int x,y,z;            scanf("%d%d%d",&x,&y,&z);            add_edge(x,y,z);        }        printf("Case %d: %d\n",ii,max_flow(1,n));    }    return 0;}

hdu2063

二分图匹配算法:对于无向图而言:

#include<bits/stdc++.h>using namespace std;const int maxn = 1000 + 10;typedef long long ll;#define clr(x,y) memset(x,y,sizeof x)#define INF 0x3f3f3f3fvector<int>g[maxn];int k,m,n;bool vis[maxn];int match[maxn];bool dfs(int u){    vis[u] = true;    for(int i = 0; i < g[u].size(); i ++)    {        int v = g[u][i], w = match[v];        if(w < 0 || !vis[w] && dfs(w))        {            match[u] = v;match[v] = u;            return true;        }    }    return false;}int binary_match(){    int ret = 0;    clr(match,-1);    for(int i = 1; i <= n; i ++)    {        if(match[i] < 0)        {            clr(vis,false);            if(dfs(i))                ret ++;        }    }    return ret;}int main(){    while( ~ scanf("%d",&k) && k)    {        scanf("%d%d",&n,&m);        for(int i = 1; i <= n; i ++)        g[i].clear();        for(int i = 1; i <= k;i ++)        {            int x,y;            scanf("%d%d",&x,&y);            g[x].push_back(y + n);            g[y + n].push_back(x);        }        printf("%d\n",binary_match());    }    return 0;}

若图为有向图的话,寻找增广路的时候加上match[v] = u就行了,而不需要 match[u] = v了。



原创粉丝点击