読者です 読者をやめる 読者になる 読者になる

とりになりたいかものはし

プログラミング(主に競プロ)に関するひとりごとなど

Codeforces #150 Div1B/Div2D Hydra

問題要約:

頂点u-vをつなぐ辺を一つ持ち、端点の片方がuの辺をh個、端点の片方がvの辺をt個持つグラフをHydraグラフと呼ぶ。(図参照) 頂点数n,mのグラフGと整数h,tが与えられるとき、Gの部分グラフにHydraグラフが含まれるか?

f:id:platypus999:20170405203818p:plain

 

制約:

\(n,m\le 10^5\)

\(h,t\le 100\)(超重要)

 

解法:

Hydraグラフのu-vをつなぐ辺を全通り試そう。u-vを固定すると、注目する頂点は以下の3つに分類できる。

①uと隣接している頂点

②vと隣接している頂点

③u,v両方と隣接している頂点

図にすると、このように分類できる。

f:id:platypus999:20170405203825p:plain

(ただし、③に含まれるものは①、②から除外する)

頂点xの次数を\(deg(x)\)で表す。この時、①②③の個数をそれぞれ\(P,Q,R\)とすると、

\(P+Q+R=deg(u)+deg(v)\)である。

また、Hydraグラフを作ることができる必要十分条件

\(P+p\le h,Q+q\le t,p+q\le R\) である。

P,Q,Rを求めることは簡単ではなさそうだ。ここでは前処理により簡単に求められる\(deg(u)\)と\(deg(v)\)からHydraグラフの有無を検出しよう。

 

A.\(deg(u)\lt h+1\)または\(deg(v)\lt t+1\)の時、

そもそも辺が足りない。当然ながらHydraグラフは作れない。

B.\(deg(u)\le h+t+1\)かつ\(deg(v)\le h+t+1\)の時、

たとえ全ての頂点が③であっても、また逆に③の頂点が一つもない場合でも、Hydraグラフを構築できる。

C.その他

この場合は素直に\(P,Q,R\)を求めよう。ここで\(h,t\le 100\)と小さいことを活用できる。

AでもBでもないので、\(h+1\le deg(u)\lt h+t+1\)かつ\(t+1\le deg(v)\lt h+t+1\)である。つまり、頂点u,vに隣接する頂点を全列挙しても\(deg(u)+deg(v)=\)高々\(2(h+t+1)\)個であり、計算量は全体で見ても\(O(m(h+t))\)と十分小さい。

 

以上のA,B,Cの場合分けは以下のように図示できる。

f:id:platypus999:20170405203811p:plain

 

 

 

 

 

 

h,tの制約を見落としていてvirtual中は解けなかった。