//hdu 4687
int pre[N];
int match[N];
int fa[N];
int Find(int u){
if(u==fa[u])return u;
return fa[u]=Find(fa[u]);
}
void Union(int u,int v){
u=Find(u),v=Find(v);
if(u!=v)fa[u]=v;
}
vector<int> E[N];
int Q[N],bot;
int mark[N];
int vis[N];
int ti;
int lca(int x,int y){
ti++;
while(1){
if(x!=-1){
x=Find(x);
if(vis[x]==ti)return x;
vis[x]=ti;
if(match[x]!=-1)x=pre[match[x]];
else x=-1;
}
swap(x,y);
}
}
void goup(int a,int p){
while(a!=p){
int b=match[a],c=pre[b];
if(Find(c)!=p)pre[c]=b;
if(mark[b]==2)mark[Q[bot++]=b]=1;
if(mark[c]==2)mark[Q[bot++]=c]=1;
Union(a,b);
Union(b,c);
a=c;
}
}
void augment(int s){
Q[0]=s;bot=1;mark[s]=1;
for(int head=0;match[s]==-1&&head<bot;head++){
int x=Q[head];
for(int i=0;i<E[x].size();i++){
int y=E[x][i];
if(match[x]!=y&&Find(x)!=Find(y)&&mark[y]!=2){
if(mark[y]==1){
int p=lca(x,y);
if(Find(x)!=p)pre[x]=y;
if(Find(y)!=p)pre[y]=x;
goup(x,p);
goup(y,p);
}
else if(match[y]==-1){
pre[y]=x;
int j=y;
while(j!=-1){
int k=pre[j];
int l=match[k];
match[j]=k;match[k]=j;
j=l;
}
break;
}
else {
pre[y]=x;
mark[Q[bot++]=match[y]]=1;
mark[y]=2;
}
}
}
}
}
int _hu(int n){
int ans=0;
for (int i=0;i<n;i++)match[i]=-1;
for (int i=0;i<n;i++)if(match[i]==-1){
ti=0;
for(int j=0;j<n;j++){
pre[j]=-1,fa[j]=j,mark[j]=0,vis[j]=-1;
}
augment(i);
}
for(int i=0; i<n; ++i)
E[i].clear();
for(int i=0;i<n;i++)if(match[i]!=-1){
ans++;
}
return ans/2;
}
无向图最大匹配
最新推荐文章于 2023-06-23 16:45:10 发布
8万+

被折叠的 条评论
为什么被折叠?



