版权声明:未经过作者允许,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()
{
}