日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二分图的最大带权匹配

發布時間:2025/6/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二分图的最大带权匹配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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;??
  • 總結

    以上是生活随笔為你收集整理的二分图的最大带权匹配的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。