luogu P6577 模板二分图最大权完美匹配
Posted qingyuyyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P6577 模板二分图最大权完美匹配相关的知识,希望对你有一定的参考价值。
#pragma GCC optimize (3,"inline","Ofast") #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll N=505; const ll inf=1e18; ll n,m; ll wx[N],wy[N],weight[N][N],slack[N]; ll belong[N]; bool visx[N],visy[N]; ll pre[N]; void FindPath(ll u) { ll x,y=0,yy=0,delta; memset(pre,0,sizeof pre); for(int i=1; i<=n; i++) slack[i]=inf; belong[y]=u; while(1) { x=belong[y]; delta=inf; visy[y]=1; for(ll i=1; i<=n; i++) { if(visy[i]) continue; if(slack[i]>wx[x]+wy[i]-weight[x][i]) { slack[i]=wx[x]+wy[i]-weight[x][i]; pre[i]=y; } if(slack[i]<delta) { delta=slack[i]; yy=i; } } for(ll i=0; i<=n; i++) { if(visy[i]) wx[belong[i]]-=delta,wy[i]+=delta; else slack[i]-=delta; } y=yy; if(belong[y]==-1) break; } while(y) { belong[y]=belong[pre[y]]; y=pre[y]; } } ll Km() { memset(belong,-1,sizeof(belong)); memset(wx,0,sizeof(wx)); memset(wy,0,sizeof(wy)); for(ll i=1; i<=n; i++) { memset(visy,0,sizeof(visy)); FindPath(i); } ll res=0; for(ll i=1; i<=n; i++) if(belong[i]!=-1) res+=weight[belong[i]][i]; return res; } int main() { scanf("%lld%lld",&n,&m); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) weight[i][j]=-inf; for(int i=1; i<=m; i++) { ll u,v,w; scanf("%lld%lld%lld",&u,&v,&w); weight[u][v]=w; } printf("%lld ",Km()); for(int i=1; i<=n; i++) printf("%lld ",belong[i]); return 0; }
以上是关于luogu P6577 模板二分图最大权完美匹配的主要内容,如果未能解决你的问题,请参考以下文章