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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

圆方树 useful things

發(fā)布時間:2023/11/16 windows 45 coder
生活随笔 收集整理的這篇文章主要介紹了 圆方树 useful things 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圓方樹,是解決仙人掌問題的實用方法,假設(shè)最初圖都是圓點,對于每個環(huán)新建一個方點并連接這個環(huán)上所有圓點,能很好規(guī)避同一個點可能屬于很多個環(huán)的情況,并且發(fā)現(xiàn)build完之后是一棵樹

廣義圓方樹,能夠不局限于去解決仙人掌問題,能上升到無向圖層面,很好解決圖上路徑類,等等問題

那么如何建立圓方樹?有點類似 \(v-dcc\) ,建立方點,連接當前點雙聯(lián)通分量的所有點,實現(xiàn)通過tarjan算法

但注意 \(v-dcc\) 把整個點雙聯(lián)通分量都縮成一個點了,圓方樹還保持著圓點,也就是說圓方樹點數(shù)是 \(n+k\) ,其中 \(k\) 標號是點雙個數(shù)

具體實現(xiàn)不詳講,但存在值得注意的細節(jié):

\(now\) 為當前 \(dfs\) 到的節(jié)點, \(y\) 為其搜索樹上的一個兒子。注意, \(now\)\(y\) 在棧中不一定相鄰。也就是說,下面兩種寫法:

  1. 彈出棧頂直到彈出 \(now\) 為止;最后再壓入 \(now\)
  2. 彈出棧頂直到彈出 \(y\) 為止,最后再將虛點向 \(now\) 連邊
    前者錯誤,后者正確。

代碼:

void tarjan(int x){
	++nown;
	dfn[x]=low[x]=++num;
	st.push(x),w[x]=-1; 
	for(int i=head[x];i;i=edge[i].Next){
		int to=edge[i].to;
		if(!dfn[to]){
			tarjan(to);
			low[x]=min(low[x],low[to]);
			if(low[to]>=dfn[x]){
			    addedge2(++diannum,x),addedge2(x,diannum);
				++w[diannum];
				while(1){
					addedge2(diannum,st.top()),addedge2(st.top(),diannum);
					++w[diannum];
					if(st.top()==to){
						st.pop();
						break;
					}
					st.pop();
				}
			}
		}
		else low[x]=min(low[x],dfn[to]);				
	}
}

\(v-dcc\) 和圓方樹運用區(qū)別何在?后者對于點雙內(nèi)部的處理能夠非常方便,而前者似乎處理整個點雙對答案的貢獻(不考慮單點)會十分好搞

圓方樹的性質(zhì):

  1. 是樹

  2. 每條邊都是方點和圓點連接邊

  3. 每個方點對應(yīng)一個點雙聯(lián)通分量

  4. 方點的度數(shù)是點雙聯(lián)通分量的大小

  5. 圓點是割點才有超過1個兒子,否則只連接一個方點兒子

  6. 圓方樹上兩個點的路徑經(jīng)過的圓點是圖上兩點之間的必經(jīng)點

還有一些點雙的小性質(zhì):對于一個點雙的兩點,它們之間簡單路徑的并集等于這個點雙集合

圓方樹能夠很好地將無向圖上問題轉(zhuǎn)化為樹上問題,進行統(tǒng)計類的時候可能割點會被統(tǒng)計多次,所有一般把方點賦為-1,然后就很好做了,等等就不細說了

總結(jié)

以上是生活随笔為你收集整理的圆方树 useful things的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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