【原创】二分图模板

版权声明:未经过作者允许,QωQ是可以转载的,只不过要赞一下本文章并发评论告诉我,然后转载附上原网址就好了!=QωQ= https://blog.csdn.net/c20182030/article/details/78402635

天天高高兴兴打打模板

#include<cmath>  
#include<queue>
#include<cstdio> 
#include<vector>
#include<cstring>  
#include<algorithm>  
using namespace std;  

const int MAXN=100;
const int INF=0x3f3f3f3f;

int N,M,cnx,cny;

struct edge//临界表存图
{
    int to,val;
    bool operator < (const edge & p) const
    {
        return val<p.val;
    }
}h;
vector <edge> G[MAXN];
int cnt,head[MAXN];
void addedge(int u,int v,int w)
{
    h.to=v,h.val=w;
    G[u].push_back(h);
}

int col[MAXN];

#define lazy(i) int sz=G[i].size()
#define v(u,i) G[u][i].to
#define w(u,i) G[u][i].val

bool mrk(int u,int mc)
{
    lazy(u);
    for(int i=0;i<sz;i++)
    {
        if(col[v(u,i)])
        {
            if(col[v(u,i)]!=mc) return false;
            continue;
        }
        col[v(u,i)]=mc;
    }
    return true;
}

bool if_is()
{
    int c=1;
    for(int i=1;i<=N;i++)
        if(!col[i]) 
        {
            bool got=mrk(i,c);
            c=-c;
            if(got==false) return false;
        }
    return true;
}

#define ac(a,b) memset(a,b,sizeof a)
#define cc(a) ac(a,0)

bool vis[MAXN];
int linky[MAXN];

bool ark(int u)
{
    lazy(u);
    for(int i=0;i<sz;i++)
    {
        if(!vis[i])
        {
            vis[i]=true;
            if(!linky[i]||ark(linky[i]))
            {
                linky[i]=u;
                return true;
            }
        }
    }
    return false;
}

int XYL()
{
    int ans=0;
    for(int i=1;i<=cnx;i++)
        cc(vis),ans+=ark(i);
    return ans;
}

int C[MAXN][MAXN];
int dbx[MAXN],dby[MAXN],pre[MAXN],slack[MAXN];

void crl(int R)
{
    int px,py=0,yy=0,d;
    cc(vis),cc(pre),ac(slack,0x3f);
    linky[py]=R;
    do
    {
        px=linky[py]; d=INF; vis[py]=1;
        for(int i=1;i<=cny;i++)
        {
            if(!vis[i])
            {
                if(dbx[px]+dby[i]-C[px][i]<slack[i])
                    slack[i]=dbx[px]+dby[i]-C[px][i],pre[i]=py;
                if(slack[i]<d) d=slack[i],yy=i;
            }
        }
        for(int i=0;i<=cny;i++)
        {
            if(vis[i]) dbx[linky[i]]-=d,dby[i]+=d;
            else slack[i]-=d;
        }
        py=yy;
    }while(linky[yy]!=0);
    while(py) linky[py]=linky[pre[py]],py=pre[py];
}

int km()
{
    cc(dbx),cc(dby),cc(linky);
    for(int i=1;i<=cnx;i++) crl(i);
    int lov=0;
    for(int i=1;i<=cny;i++)
        if(linky[i]) lov+=dbx[linky[i]]+dby[i];
    return lov;
}

int main()
{

}

猜你喜欢

转载自blog.csdn.net/c20182030/article/details/78402635
今日推荐