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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

带花树学习笔记

發(fā)布時(shí)間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 带花树学习笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引入

帶花樹(shù)解決的是一般圖的最大匹配問(wèn)題。

學(xué)習(xí)此算法前你需要掌握二分圖匹配的匈牙利算法,至少需要知道它的思想。

理論

眾所周知,二分圖匹配的思想是不斷地找增廣路。

嚴(yán)謹(jǐn)?shù)刂v,是找到了一條簡(jiǎn)單路徑,它的起點(diǎn)和終點(diǎn)都未匹配,并且路徑上的邊是 匹配邊-非匹配邊 相互交錯(cuò)。

但是在一般圖中直接找增廣路會(huì)出鍋。

原因是二分圖中可以保證增廣的過(guò)程中匹配邊都是從左邊連到右邊,但一般圖中因?yàn)槠姝h(huán)的存在,使得這個(gè)方向是不定的。具體的原因不(lan)再(de)說(shuō)明,自己畫(huà)個(gè)圖就可以看出。

我們注意到,二分圖和一般圖最本質(zhì),或者說(shuō)唯一的區(qū)別就是是否存在奇環(huán)。

注:對(duì)于這個(gè)奇環(huán)雖然不一定簡(jiǎn)單,但直接把它當(dāng)成簡(jiǎn)單環(huán)處理,后面會(huì)詳細(xì)說(shuō)明。

我們發(fā)現(xiàn)對(duì)于一個(gè)大小為2k+12k+12k+1的奇環(huán),從任意一個(gè)點(diǎn)都可以向外匹配,并且環(huán)內(nèi)剩下的2k2k2k個(gè)點(diǎn)可以組成kkk對(duì)匹配。

這么說(shuō)的話,環(huán)上的每個(gè)點(diǎn)都是等效的。

這么說(shuō)我們可以直接把這2k+12k+12k+1個(gè)點(diǎn)縮成一個(gè)點(diǎn)處理,我們把縮成的點(diǎn)稱為"花"。

然后繼續(xù)增廣就可以了。

流程

前面說(shuō)著簡(jiǎn)單其實(shí)全在口胡……本算法的難點(diǎn)全在實(shí)現(xiàn)上。

記錄每個(gè)點(diǎn)的匹配點(diǎn)mim_imi?,如果沒(méi)有匹配mi=0m_i=0mi?=0,顯然初始時(shí)mi=0m_i=0mi?=0

首先枚舉所有結(jié)點(diǎn),當(dāng)發(fā)現(xiàn)一個(gè)未匹配點(diǎn)(即mi=0m_i=0mi?=0)時(shí),嘗試從這個(gè)點(diǎn)為起點(diǎn)找一條增廣路。

設(shè)這個(gè)點(diǎn)為sss,從sss為根開(kāi)始做 BFS 建出一棵帶花樹(shù)。注意帶花樹(shù)是對(duì)一個(gè)根單獨(dú)建的,也就是每次都要清空數(shù)據(jù)。

因?yàn)槲覀円页鲈鰪V路翻轉(zhuǎn),對(duì)每個(gè)結(jié)點(diǎn)iii記錄一個(gè)前驅(qū) preipre_iprei?,表示如果以sss為增廣路起點(diǎn),iii為終點(diǎn),路徑上的倒數(shù)第二個(gè)點(diǎn)(也就是iii往上跳一個(gè)點(diǎn))是哪個(gè)。

值得注意的是,找增廣路的時(shí)候并不是一直跳preipre_iprei?,因?yàn)樵鰪V路是交替的,跳一步之后下一步一定是匹配邊。

所以跳一步preprepre后直接走到對(duì)應(yīng)的匹配點(diǎn),即不斷地i←mpreii \leftarrow m_{pre_i}imprei??,這在后面將很有用。

對(duì)點(diǎn)進(jìn)行染色。一個(gè)點(diǎn)有三種狀態(tài):黑色,白色,未染色。開(kāi)始時(shí)所有點(diǎn)都未染色。然后起點(diǎn)sss設(shè)為黑色。

每次從隊(duì)列中取出一個(gè)點(diǎn)uuu,從后面的流程可以知道它一定是黑點(diǎn)。

訪問(wèn)所有與uuu相鄰的點(diǎn)vvv,然后大力分類討論。

  • uuuvvv在一個(gè)花中(也就是被縮成了一個(gè)點(diǎn))
  • 不知道咋處理,但腦電波一下應(yīng)該沒(méi)啥影響,所以跳過(guò)好了。

  • vvv是白色
  • 似乎還是沒(méi)啥用,跳過(guò)好了。

  • vvv未染色
  • 如果 vvv沒(méi)有被匹配,那么我們就找到了一條增廣路,跳preprepre翻轉(zhuǎn)所有邊的匹配狀態(tài),答案+1+1+1,退出函數(shù)。

    否則我們把vvv染成白色,并令prev=upre_v=uprev?=u。因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">vvv已經(jīng)有匹配了,我們把mvm_vmv?染成黑色并壓進(jìn)隊(duì)列,表示從可以這里開(kāi)始增廣。

  • vvv是黑色
  • 最復(fù)雜的情況。當(dāng)找到一個(gè)黑色的時(shí)候說(shuō)明出現(xiàn)了一個(gè)奇環(huán)。

    因?yàn)槭?bfs,我們可以暴力跳preprepre找到以sss為根時(shí)uuuvvv的 LCA ,記為ppp

    我們需要把這條路徑上的點(diǎn)合并。

    可以用并查集維護(hù),把路徑上的點(diǎn)并查集的父親設(shè)為ppp就可以了。注意花里面可能套了花,所以只考慮并查集的根。

    然而還沒(méi)完,因?yàn)槟氵€要求出具體的匹配點(diǎn),所以你需要維護(hù)環(huán)內(nèi)的匹配情況。

    圖例:粗邊為匹配邊,細(xì)邊為未匹配邊,箭頭為preprepre

    為了貫徹落實(shí)“任何一個(gè)點(diǎn)都可以向外匹配”的性質(zhì),盯著這個(gè)圖,發(fā)現(xiàn)任何一個(gè)黑點(diǎn)(即所有匹配邊的下面那個(gè))在外面有匹配邊的時(shí)候,都可以向上整一條增廣路出來(lái)。

    vvv為例:

    我們想讓白點(diǎn)(匹配邊上面那個(gè))也可以整一個(gè)出來(lái),不難構(gòu)造出

    地 獄 繪 圖

    這樣利用找增廣路是隔一次跳一步的性質(zhì),白點(diǎn)會(huì)從下面繞一圈上去,完美地解決了這個(gè)問(wèn)題。具體實(shí)現(xiàn)見(jiàn)代碼。

    然后在跳的過(guò)程中把白點(diǎn)染成黑點(diǎn)并入隊(duì),表示歡迎外面的點(diǎn)進(jìn)來(lái)找增廣路。

    如果你不知道為什么原來(lái)就是黑色的點(diǎn)不入隊(duì),想想你把它染成黑色的時(shí)候在干什么。

    總復(fù)雜度是O(n3)O(n^3)O(n3),實(shí)際上很松,可以當(dāng)O(n2)O(n^2)O(n2)

    #include <iostream> #include <cstdio> #include <cstring> #include <cctype> #include <queue> #define MAXN 1005 #define MAXM 100005 using namespace std; inline int read() {int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans; } struct edge{int u,v;}e[MAXM]; int head[MAXN],nxt[MAXM],cnt; void addnode(int u,int v) {e[++cnt]=(edge){u,v};nxt[cnt]=head[u];head[u]=cnt; } int mat[MAXN],pre[MAXN],col[MAXN],fa[MAXN],n,m; int idx[MAXN],tot; inline int find(const int& x){return x==fa[x]? x:fa[x]=find(fa[x]);} queue<int> q; inline int lca(int x,int y) {for (++tot;;swap(x,y))if (x){x=find(x);if (idx[x]==tot) return x;idx[x]=tot,x=pre[mat[x]]; } } inline void shrink(int x,int y,int l) {while (find(x)!=l){pre[x]=y,y=mat[x];if (col[y]==2) col[y]=1,q.push(y);if (x==find(x)) fa[x]=l;if (y==find(y)) fa[y]=l;x=pre[y];} } inline int bfs(int s) {while (!q.empty()) q.pop();q.push(s);col[s]=1;for (int i=1;i<=n;i++) pre[i]=col[i]=0,fa[i]=i;while (!q.empty()){int u=q.front();q.pop();for (int i=head[u];i;i=nxt[i]){int v=e[i].v;if (col[v]==2||find(u)==find(v)) continue;if (!col[v]){col[v]=2,pre[v]=u;if (!mat[v]){for (int last;v;v=last)last=mat[pre[v]],mat[v]=pre[v],mat[pre[v]]=v;return 1;}col[mat[v]]=1,q.push(mat[v]);}else{int l=lca(u,v);shrink(u,v,l),shrink(v,u,l);}}}return 0; } int main() {n=read(),m=read();for (int i=1;i<=m;i++){int u,v;u=read(),v=read();addnode(u,v),addnode(v,u);}for (int i=1;i<=n;i++) fa[i]=i;int ans=0;for (int i=1;i<=n;i++)if (!mat[i])ans+=bfs(i);printf("%d\n",ans);for (int i=1;i<=n;i++) printf("%d%c",mat[i]," \n"[i==n]);return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的带花树学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 成人免费区一区二区三区 | 国产片在线播放 | 国产av成人一区二区三区高清 | 麻豆亚洲一区 | 懂色av一区二区夜夜嗨 | 激情三区 | a级大片免费看 | 另类天堂av | 成人一级生活片 | 国产美女久久久久久 | 久久婷婷网 | 亚洲视频在线视频 | 一区二区三区麻豆 | 日本中文有码 | 亚洲图色在线 | 久久久国产精品成人免费 | 色爱色| 精品少妇视频 | 国产精品久久久国产盗摄 | 台湾av在线 | 国产精品二区一区二区aⅴ 一卡二卡三卡在线观看 | 国产视频第一页 | 在线麻豆av | 男同毛片 | 亚洲av无码国产精品永久一区 | www.久久婷婷| 天天干夜夜操视频 | 99久久国产宗和精品1上映 | 国产三级精品视频 | 91国产丝袜播放在线 | 蜜桃aaa | 91视频毛片| www.成年人| 色呦呦呦呦 | 亚洲精品一二三四 | 亚洲熟女乱综合一区二区 | 色婷婷av一区 | 99国产精品欲 | 精品少妇人妻av免费久久久 | 都市激情亚洲综合 | 1级黄色大片儿 | 伊人影片 | 黄色激情四射 | 2019最新中文字幕 | 中文字幕25页 | 日本欧美一级 | 噜噜色av | av在线在线 | 午夜性福利视频 | 亚洲欧美自拍视频 | 天降女子在线 | av免费播放 | 91亚洲精品国偷拍 | 男同激情视频 | 日韩毛片儿 | 日本成人小视频 | 成人av网址在线 | 男女性生活视频网站 | 牛牛精品一区二区 | 丝袜五月天 | 91精品国产一区 | 日韩亚州| 久久久久久色 | 在线观看亚洲欧美 | 亚洲一区在线观看视频 | 欧美亚洲丝袜 | 成人av在线网站 | 亚洲精品高潮久久久久久久 | 久草操| 黄色大片黄色大片 | 亚洲国产aaa| 日本h漫在线观看 | 欧美三级中文字幕 | 福利一区福利二区 | 女同调教视频 | 97影院在线午夜 | 黄色网www| 国产精品夜夜爽 | 亚洲一区二区三区av无码 | 麻豆av影院 | 综合激情网 | 97人人射 | 天天操天天添 | 国产精品一亚洲av日韩av欧 | 天海翼av| 国产九九热视频 | 国产成人久久精品流白浆 | 九九99精品视频 | 成人动漫久久 | 亚洲乱码国产乱码精品精98午夜 | 在线日韩一区二区 | 小明看国产 | 亚洲美女视频网 | 久久国产主播 | 五月天久久 | 美女校花脱精光 | xxxxxx国产| 日韩国产小视频 | 国产女主播一区二区 |