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

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

生活随笔

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

编程问答

【图论】支配树

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

定義

支配樹(shù)一般用來(lái)求有向圖必經(jīng)點(diǎn)問(wèn)題,
即:給定起點(diǎn)S,問(wèn)對(duì)于每個(gè)點(diǎn)i,S到i的必經(jīng)點(diǎn)有哪些;

點(diǎn)i在支配樹(shù)上父親就是距離它最近的必經(jīng)點(diǎn),
顯然的,必經(jīng)點(diǎn)是具有一定傳遞性的,所以對(duì)于點(diǎn)i,S到i的所有必經(jīng)點(diǎn),就是支配樹(shù)上i到根的路徑上的所有點(diǎn)。

建樹(shù)

首先,對(duì)于一棵樹(shù),它的支配樹(shù)就是它本身;

對(duì)于一個(gè)DAG,它的支配樹(shù)也很好求,
先排拓?fù)湫?#xff0c;對(duì)于點(diǎn)i,它在支配樹(shù)上的父親就是所有能到達(dá)它的點(diǎn)在支配樹(shù)上的LCA,這個(gè)挺好理解的,

那么對(duì)于一般的有向圖呢?

先定義一些東西:dfn[x]表示x這個(gè)點(diǎn)的dfs序,

定義點(diǎn)y是點(diǎn)x的半支配點(diǎn),當(dāng)且僅當(dāng)存在一條從y到x的路徑y,v1,v2,v3....,vk,xy,v_1,v_2,v_3....,v_k,xy,v1?,v2?,v3?....,vk?,x,滿足dfn[vi]>dfn[x](1≤i≤k)dfn[v_i]>dfn[x](1\leq i \leq k)dfn[vi?]>dfn[x](1ik),這條路徑就叫它支配路徑好了(捂臉);
設(shè)semi[x]表示x的所有半支配點(diǎn)中,dfn最小的那個(gè); 顯然最小的是唯一的
(顯然的,每個(gè)點(diǎn)semi至少是它在dfs樹(shù)上的父親)
定義idom[x]表示點(diǎn)x在支配樹(shù)上的父親(距離x最近的必經(jīng)點(diǎn))

通過(guò)定義可以得出一個(gè)結(jié)論:
結(jié)論1:刪除原圖中的非樹(shù)邊(dfs樹(shù)),再添加邊(semi[x],x),支配樹(shù)依舊不變。

證明:
我們考慮對(duì)于每個(gè)點(diǎn)x,刪除它的其他入邊并加上(semi[x],x)后,對(duì)全局的影響,
對(duì)于一個(gè)點(diǎn),它的入邊分成3類(lèi):

  • 樹(shù)邊
  • 父親連過(guò)來(lái)(dfn小于當(dāng)前點(diǎn))
  • 后代/橫叉邊(dfn大于當(dāng)前點(diǎn))
  • 第一種邊得到了直接的保留,不用管,

    對(duì)于第二種,第三種邊,這些邊存在的意義就是提供一條路徑,使得不經(jīng)過(guò) x到根路徑上的樹(shù)邊 也能從x的某一個(gè)祖先走過(guò)來(lái),
    而又因?yàn)槿绻鹹在semi[x]到x在dfs樹(shù)的路徑上(不含semi[x]),那么y一定不是x的必經(jīng)點(diǎn),也就是只要semi[x]提供了路徑就夠了,其他y沒(méi)有必要再提供,

    有了這個(gè)結(jié)論就可以把一般圖轉(zhuǎn)為DAG再用上面的方法了,復(fù)雜度:O(nlog?(n))O(n\log(n))O(nlog(n))

    要注意:semi不等于idom,通過(guò)semi我們只能確認(rèn)idom一定不再semi[x]~x這段樹(shù)上路徑(不含semi[x])上,對(duì)于idom是否等于semi還需要分類(lèi)討論。

    關(guān)于semi怎么求請(qǐng)繼續(xù)往下看


    接下來(lái)是O(n)O(n)O(n)的方法
    既然我們都把semi求出來(lái)了,考慮如何用semi推出idom,

    有一個(gè)顯然的結(jié)論:
    結(jié)論2:對(duì)于點(diǎn)x,它到idom[x]的dfs樹(shù)上路徑中,一定不存在在路徑上的點(diǎn)y,使得 dfn[idom[y]]<dfn[idom[x]];

    由此可以比較自然的再拋出一個(gè)結(jié)論:
    結(jié)論3:設(shè)y為semi[x]~x樹(shù)上路徑上(不含semi[x]),dfn[idom[y]]最小的點(diǎn),則idom[x]=(dfn[semi[x]]<dfn[idom[y]])?semi[x]:idom[y];
    這個(gè)證明挺顯然的,因?yàn)橐呀?jīng)轉(zhuǎn)成DAG了,歸納即可;

    這個(gè)東西同理得:semi[y]是路徑上所有的semi中dfn最小的

    這樣我們就可以在得知semi后快速求出idom;


    那么現(xiàn)在問(wèn)題來(lái)了,怎么求出semi?

    我們?cè)O(shè)bestxbest_xbestx?表示點(diǎn)x的入邊中,出發(fā)點(diǎn)dfn最小的點(diǎn),(直接連向x的點(diǎn)中dfn最小的)

    按dfn排序從大到小做,
    我們做的過(guò)程相當(dāng)于每次加入一個(gè)點(diǎn)x,dfn[x]一定是當(dāng)前全局最小的,相當(dāng)于加入了一個(gè)子樹(shù)根,
    (下面為了方便表示用min表示“取dfn最小的點(diǎn)”
    那么semi[x]=min?{best[y](y可以到達(dá)x)}semi[x]=\min\{best[y](y可以到達(dá)x)\}semi[x]=min{best[y](y達(dá)x)}(注意這里只能走已經(jīng)加入了的點(diǎn))
    同樣的semi[x]=min?{semi[y](y可以到達(dá)x)}semi[x]=\min\{semi[y](y可以到達(dá)x)\}semi[x]=min{semi[y](y達(dá)x)}
    同樣的semi[x]=min?{semi[y](y可以只經(jīng)過(guò)一條樹(shù)邊到達(dá)x)}semi[x]=\min\{semi[y](y可以只經(jīng)過(guò)一條樹(shù)邊到達(dá)x)\}semi[x]=min{semi[y](y經(jīng)過(guò)樹(shù)達(dá)x)}

    也就是說(shuō),我們每加入一個(gè)新點(diǎn)x,設(shè)y為可以通過(guò)返祖邊直接到達(dá)x的點(diǎn),z為y~x樹(shù)上路徑上的點(diǎn),則semi[x]=min?{semi[z]}semi[x]=\min\{semi[z]\}semi[x]=min{semi[z]}

    這個(gè)可以通過(guò)帶權(quán)并查集,利用其路徑壓縮的特性來(lái)做,(壓縮每個(gè)點(diǎn)到當(dāng)前根的路徑)

    求出了semi那怎么求idom呢,
    我們只需要找到x~semi[x]的路徑上(不含semi[x])semi的dfn最小的點(diǎn)即可,

    這個(gè)相當(dāng)于詢問(wèn)一條祖先后代鏈上權(quán)值最小的點(diǎn)是哪個(gè),
    和上面一樣的方案,只不過(guò)主體反過(guò)來(lái)了,我們把詢問(wèn)掛到dfn較小的那個(gè)點(diǎn)上,每次依舊是用帶權(quán)并查集維護(hù),

    Code

    這里給出的是CodeChef上GRAPHCNT這一題的標(biāo),
    這題就是個(gè)版子題。

    #include <cstdio> #include <algorithm> #include <iostream> #define fo(i,a,b) for(int i=a;i<=b;++i) #define fod(i,a,b) for(int i=a;i>=b;--i) #define efo(i,q,I) for(int i=A[I][q];i;i=B[i][0]) #define min(q,w) ((q)>(w)?(w):(q)) #define max(q,w) ((q)<(w)?(w):(q)) using namespace std; typedef long long LL; const int N=200500; int read(int &n) {char ch=' ';int q=0,w=1;for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar());if(ch=='-')w=-1,ch=getchar();for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n; } int m,n; LL ans; int B[15*N][2],A[4][N],B0; int dfn[N],dfn0,Dzx[N],Fa[N]; int g[N],gv[N]; int semi[N],idom[N]; bool z[N]; int gf(int q){return g[q]==q?q:(gf(g[q]),(gv[q]=(dfn[semi[gv[g[q]]]]<dfn[semi[gv[q]]])?gv[g[q]]:gv[q]),g[q]=g[g[q]]);} void link(int q,int w,int I) {B[++B0][0]=A[I][q],A[I][q]=B0,B[B0][1]=w; } void tarjan(int q) {z[q]=1;Dzx[dfn[q]=++dfn0]=q;efo(i,q,0){if(!z[B[i][1]])tarjan(B[i][1]),Fa[B[i][1]]=q;if(dfn[semi[B[i][1]]]>dfn[q])semi[B[i][1]]=q;} } void Gsemi() {fo(i,1,n)g[i]=gv[i]=i;fod(I,dfn0,1){int q=Dzx[I];efo(i,q,1)if(dfn[B[i][1]]>dfn[q]){gf(B[i][1]);if(dfn[semi[gv[B[i][1]]]]<dfn[semi[q]])semi[q]=semi[gv[B[i][1]]];}gv[q]=q;link(semi[q],q,2);efo(i,q,2)if((gf(B[i][1]),semi[gv[B[i][1]]])==q)idom[B[i][1]]=q;else idom[B[i][1]]=gv[B[i][1]];efo(i,q,0)if(dfn[B[i][1]]>dfn[q]&&g[B[i][1]]==B[i][1])g[B[i][1]]=q;}fo(i,2,dfn0){int q=Dzx[i];if(idom[q]!=semi[q])idom[q]=idom[idom[q]];} } int Si[N]; int dfs(int q,int fa) {Si[q]=1;efo(i,q,3)if(B[i][1]!=fa)Si[q]+=dfs(B[i][1],q);return Si[q]; } int main() {int q,w;read(n),read(m);fo(i,1,m)read(q),read(w),link(q,w,0),link(w,q,1);fo(i,1,n)semi[i]=i;tarjan(1);Gsemi();idom[1]=0;fo(i,1,n)if(idom[i])link(idom[i],i,3);dfs(1,0);ans=q=0;efo(i,1,3){ans+=(LL)q*Si[B[i][1]];q+=Si[B[i][1]];}printf("%lld\n",ans+Si[1]-1);return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的【图论】支配树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

    主站蜘蛛池模板: 日本精品免费视频 | 日日干日日摸 | 精品免费一区 | 欧美激情综合色综合啪啪五月 | 免费麻豆国产一区二区三区四区 | 日啪| 国产a级大片 | 芒果视频污污 | 日韩亚洲欧美一区 | 亚洲成人免费av | 黄色av电影在线 | 国产一二三区在线 | 人超碰| 成人av毛片| 日韩精品免费一区二区三区 | av在线免费观看网站 | 最近最新最好看的2019 | 一边摸内裤一边吻胸 | 国产一级免费av | 免费看av大片 | 毛片视频网站 | 欧美精品在线观看一区二区 | 国产免费一区二区三区免费视频 | 日韩精品中文字 | 日本做爰高潮又黄又爽 | 后宫秀女调教(高h,np) | 小泽玛利亚在线 | 欧美日韩中文一区 | 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 成年人黄色小视频 | 一级片在线免费观看 | 国产+日韩+欧美 | 国产精品久久久久久69 | 日韩电影中文字幕 | 五月婷婷激情视频 | 欧美日韩国产亚洲一区 | 国产一级片黄色 | 少妇全黄性生交片 | 午夜三级网站 | 熟妇大屁股一区二区三区视频 | 欧美日韩精品久久久免费观看 | 玖玖玖在线观看 | 蜜桃视频久久一区免费观看入口 | h部分肌肉警猛淫文 | 欧美成人午夜免费视在线看片 | 国产一区二区精品丝袜 | 亚洲国产aⅴ成人精品无吗 日韩乱论 | 人妻一区二区在线 | av网站一区二区 | www.色com| 日本亚洲色大成网站www久久 | 国产精品8 | 欧洲成人在线 | 欧美综合亚洲图片综合区 | 日韩怡红院 | 日本网站黄色 | 国产精品无码免费播放 | 欧美视频一区二区三区在线观看 | 国产精品久久久久91 | 超碰色偷偷| 已满十八岁免费观看 | 大黑人交xxx极品hd | 波多野吉衣一二三区乱码 | 99re8在线精品视频免费播放 | 黄色91| 午夜看看 | 亚洲欧美在线一区 | 男女做激情爱呻吟口述全过程 | 男女互操在线观看 | 国产欧美第一页 | 丁香六月色婷婷 | 中文字幕在线天堂 | 最新极品jizzhd欧美 | 蜜臀99久久精品久久久久小说 | 完全免费av | 中文字幕一区二区三区在线观看 | 国产免费福利 | 日韩成人午夜电影 | 久久国产激情 | 小柔的淫辱日记(h | 久久久精品一区二区三区 | 精品久久久久久久久久久国产字幕 | www精品| 国产精品理论在线观看 | 欧美高清性xxxxhd | 日本草逼视频 | 污视频网站在线看 | 91麻豆产精品久久久久久夏晴子 | 日本三级视频在线观看 | 日韩在线视频观看免费 | 色视频线观看在线播放 | av免费网| 黄色网在线播放 | 久久肉 | 男女男精品视频 | 久久久久亚洲日日精品 | 久久精品性爱视频 | 亚洲精品二 | 风间由美在线观看 |