生活随笔
收集整理的這篇文章主要介紹了
二分图的最大带权匹配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
KM算法是求最大權完備匹配,如果要求最小權完備匹配怎么辦?方法很簡單,只需將所有的邊權值取其相反數,求最大權完備匹配,匹配的值再取相反數即可。
KM算法的運行要求是必須存在一個完備匹配,如果求一個最大權匹配(不一定完備)該如何辦?依然很簡單,把不存在的邊權值賦為0。
KM算法求得的最大權匹配是邊權值和最大,如果我想要邊權之積最大,又怎樣轉化?還是不難辦到,每條邊權取自然對數,然后求最大和權匹配,求得的結果a再算出e^a就是最大積匹配。至于精度問題則沒有更好的辦法了
[html]view plaincopyprint?
class?match{?? ?? ????public:?? ????????int?lx[N],ly[N];?? ????????int?Stack[N],next[N];?? ????????bool?visx[N],visy[N];?? ????????int?n;?? ????????vector<int>vec[N];?? ????????void?init()?? ????????{?? ????????????rep(i,n+1)?vec[i].clear();?? ????????????memset(next,-1,sizeof(next));?? ????????}?? ????????bool?bfs(int?u)?? ????????{?? ????????????visx[u]=true;?? ????????????rep(i,vec[u].size())?? ????????????{?? ????????????????if(visy[i]==true)?continue;?? ????????????????if(lx[u]+ly[i]==vec[u][i])?? ????????????????{?? ????????????????????visy[i]=true;?? ????????????????????if(next[i]==-1?||?bfs(next[i]))?? ????????????????????{?? ????????????????????????next[i]=u;?return?true;?? ????????????????????}?? ????????????????}?? ????????????????else??? ????????????????????Stack[i]=min(Stack[i],lx[u]+ly[i]-vec[u][i]);?? ????????????}?? ????????????return?false;?? ????????}?? ????????int?km()?? ????????{?? ????????????rep(i,n)?lx[i]=-inf;?? ????????????rep(i,n)?? ????????????{?? ????????????????ly[i]=0;?? ????????????????rep(j,n)??? ????????????????????lx[i]=max(lx[i],vec[i][j]);?? ????????????}??? ????????????rep(i,n)?? ????????????{?? ????????????????while(true)?? ????????????????{?? ????????????????????memset(visx,false,sizeof(visx));?? ????????????????????memset(visy,false,sizeof(visy));?? ????????????????????rep(j,n)?Stack[j]=inf;?? ????????????????????if(bfs(i))?break;?? ????????????????????int?Min=inf;?? ????????????????????rep(j,n)?? ????????????????????????if(visy[j]==false)?? ????????????????????????????Min=min(Min,Stack[j]);?? ????????????????????rep(j,n)?? ????????????????????{?? ????????????????????????if(visx[j]==true)?lx[j]-=Min;?? ????????????????????????if(visy[j]==true)?ly[j]+=Min;?? ????????????????????}?? ????????????????}?? ????????????}?? ????????????int?ans=0;?? ????????????rep(i,n)?? ????????????????ans+=vec[next[i]][i];?? ????????????return?ans;?? ????????}?? };?? match?sa;??
總結
以上是生活随笔為你收集整理的二分图的最大带权匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。