<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>数奇な因子 &#187; algorithm</title>
	<atom:link href="http://www.numericalfactor.org/wp/tag/algorithm/feed" rel="self" type="application/rss+xml" />
	<link>http://www.numericalfactor.org/wp</link>
	<description>Numerical Factor</description>
	<lastBuildDate>Sun, 02 May 2010 09:50:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>アジア地区予選の復習</title>
		<link>http://www.numericalfactor.org/wp/archives/248</link>
		<comments>http://www.numericalfactor.org/wp/archives/248#comments</comments>
		<pubDate>Mon, 19 Nov 2007 11:19:16 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[algorithm]]></category>
		<category><![CDATA[icpc]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/248</guid>
		<description><![CDATA[一度解法聞いてるのに，まだ解けてない問題がある…．

問題とサンプル入出力は公式サイトで公開されてます．

以下ネタバレのため省略されました．続きを読むには(ry

おおよそ復習に手を付けた順に．

slimな全域木]]></description>
			<content:encoded><![CDATA[<p>一度解法聞いてるのに，まだ解けてない問題がある…．</p>

<p>問題とサンプル入出力は<a href="http://www.logos.ic.i.u-tokyo.ac.jp/icpc2007/jp/">公式サイト</a>で公開されてます．</p>

<p>以下ネタバレのため省略されました．続きを読むには(ry</p>

<p>おおよそ復習に手を付けた順に．</p>

<p>slimな全域木は，解説の通り．全域木を構成する辺のうち最軽辺をループ毎に重くして，全域木を作れなくなるまで繰り返す．</p>

<p>バックギャモンの問題は，メモ探のテーブルをゼロ初期化してたために確率ゼロと見分けがつかずTLE状態だった．安易にmemsetしたのが間違いのもと…．なんで気付かないかなー．
-1で初期化して普通の速さに．</p>

<p>構文解析してバグを見つけるという問題は，<a href="http://fxp.hp.infoseek.co.jp/arti/parser.html">10分パーザ</a>のおかげで書けた．Syntax errorは無いということで気が楽．配列名→サイズのmap，(配列名とインデックス)→値のmapが大域にあれば良い．</p>

<p>海から最も遠い点の問題は，ライブラリの重要さが身にしみた．人のライブラリを使うなら，最低でも使い方を把握しろ>自分．
使った解法は，凸多角形を縮小する（クリッピングというのか）長さについて二分探索．</p>

<p>幽霊の問題．両側探索するのにpriority_queueを使っていたせいで無駄に悩んだ．queueに直してあっさり終了．問題文のサンプルで3秒弱，<a href="http://www.logos.ic.i.u-tokyo.ac.jp/icpc2007/jp/">公開されたサンプル入出力</a>で23秒程度だった．さすが両側探索．</p>

<p>折り紙の体積（違）を求める問題は，とりあえず展開図の頂点を列挙するとこまで書いた（ここまで書いて思い出したけど，頂点を一つ決めた後，残りの頂点が格子上に乗ってるかチェックしていない気がする）．これで展開図がかけるので，あとは展開図から高さを求めれば良いんだけど…．</p>

<p>最短路の問題と最後の問題はまだ手付かず．最短路のは，グラフに落とすのが面倒そう．</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/248/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>固有ベクトルを求める その2</title>
		<link>http://www.numericalfactor.org/wp/archives/234</link>
		<comments>http://www.numericalfactor.org/wp/archives/234#comments</comments>
		<pubDate>Fri, 07 Sep 2007 16:36:12 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[algorithm]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[misc]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/234</guid>
		<description><![CDATA[研究室で考えた話を反芻すべく記録していくこのコーナー，第二回．

反復法を利用した固有ベクトルの計算方法は前回の話で良いとして，
それで求めた固有ベクトルの直交性に問題があることがある．

これは，まず]]></description>
			<content:encoded><![CDATA[<p>研究室で考えた話を反芻すべく記録していくこのコーナー，第二回．</p>

<p>反復法を利用した固有ベクトルの計算方法は前回の話で良いとして，
それで求めた固有ベクトルの直交性に問題があることがある．</p>

<p>これは，まず一つに（と言っても今のところこれしか知らない…）固有値同士が近接している場合に起こる．</p>

<p>逆反復法で数値的に求めるときに問題が起こる例として，
行列Aに固有値&lambda;<sub>1</sub>と&lambda;<sub>2</sub>があり，
&lambda;<sub>2</sub>は&lambda;<sub>1</sub>とほとんど同じとする（数学的には&lambda;<sub>1</sub>&ne;&lambda;<sub>2</sub>だが数値的に&lambda;<sub>1</sub>&#8786;&lambda;<sub>2</sub>）．
まずA<sub>1</sub> = (&lambda;<sub>1</sub>E &#8211; A)の絶対値最小固有値に対応する固有ベクトルを求め，
次にA<sub>2</sub> = (&lambda;<sub>2</sub>E &#8211; A)のそれを求める．
この時，&lambda;<sub>1</sub>と&lambda;<sub>2</sub>は数値的にほぼ同じ値なので
A<sub>1</sub>&#8786;A<sub>2</sub>であり，
それぞれの反復結果はどちらも似たようなベクトルになってしまう．</p>

<p>異なる固有値に属する固有ベクトルは直交すると考えて処理しているのに，
ここで同じベクトルが出てきてしまい，後で困ったことになったりするわけです．</p>

<p>ではどうするかというと．似た値の固有値同士を適当な誤差評価の元に同じ値とみなして
（仮にN個の固有値を同値とみなしたとする），
N本の直交するベクトルを初期値として用意して，反復法を適用する．
これらの直交ベクトルはイテレーションの度にある方向に傾くけれど，
その都度直交化を施すことで直交性を確保できる，と．</p>

<p>直交化付き同時冪乗法は似たような考え方だったと思う．</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/234/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>固有ベクトルを求める</title>
		<link>http://www.numericalfactor.org/wp/archives/219</link>
		<comments>http://www.numericalfactor.org/wp/archives/219#comments</comments>
		<pubDate>Sun, 26 Aug 2007 15:46:25 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[algorithm]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[math]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/219</guid>
		<description><![CDATA[<p>すみませんがサーバでエラーが起こりました。このページを再読込してください</p><p>すみませんがサーバでエラーが起こりました。このページを再読込してください</p>固有ベクトルを（数値的に）求める方法．

行列の固有ベクトルと固有値は，
（あるベクトルにその行列をかけた結果を）それぞれ伸縮する方向と伸縮率を表します．
というのは4274065782,textからの受け売り．
アニメ [...]]]></description>
			<content:encoded><![CDATA[<p>すみませんがサーバでエラーが起こりました。このページを再読込してください</p><p>すみませんがサーバでエラーが起こりました。このページを再読込してください</p><p>固有ベクトルを（数値的に）求める方法．</p>

<p>行列の固有ベクトルと固有値は，
（あるベクトルにその行列をかけた結果を）それぞれ伸縮する方向と伸縮率を表します．
というのは<amazon>4274065782,text</amazon>からの受け売り．
<a href="http://www.ohmsha.co.jp/data/link/4-274-06578-2/anime/index.html">アニメーションで見る線形代数</a>を見るとわかりやすい．</p>

<p><amazon>4274065782,caption</amazon></p>

<p>つまり，ベクトルに行列をかける（<b>y</b>=A<b>x</b>とでも書く）と，
元のベクトルはその行列の固有ベクトルの方向に移される．
ここで固有ベクトルは一般には複数存在するが，
（ベクトル<b>y</b>の）方向はそれらのうち一番伸縮率が大きい固有ベクトルに左右される．
つまり最も大きい固有値に対応する固有ベクトルの方向に支配される
（固有値が負だけど絶対値は大きいときは，その固有ベクトルと逆の方向を向くだけで，
結局その方向に支配されることに変わりはない．ということで厳密には
<strong>絶対値最大の</strong>固有値に対応する〜というのが正しい）．</p>

<p>以上よりこんなことを考える．
適当な初期ベクトル<b>x</b><sub>0</sub>を用意して，
それに行列Aをかけてベクトル<b>x</b><sub>1</sub>を得る．
またベクトル<b>x</b><sub>1</sub>に行列Aをかけて，
ベクトル<b>x</b><sub>2</sub>を得る．
さて，この手順を延々繰り返していくと，
最終的にベクトル<b>x</b><sub>n</sub>は行列Aの絶対値最大の固有値に対応する固有ベクトルの方向に向かうはず．
これで固有ベクトル（の近似）が一つ得られる．このやり方が冪乗法（power method）．</p>

<p>これとは逆に，Aの逆行列A<sup>-1</sup>をかけていくと，
今度は絶対値最小の固有値に対応する固有ベクトルの方向に向かうことになる．
実際にはA<sup>-1</sup>を陽に求めず，LU分解して連立一次方程式を解く方が良いらしい．
つまり初期ベクトル<b>x</b><sub>0</sub>を与えて
A<b>x</b><sub>1</sub>=<b>x</b><sub>0</sub>を解き，次に
A<b>x</b><sub>2</sub>=<b>x</b><sub>1</sub>を解くというのを繰り返す．
これもまた固有ベクトルが得られる．このやり方が逆反復法（inverse iteration method）．</p>

<p>どちらも収束性は良いらしい．</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/219/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最近のgccは気を利かせすぎるようだ</title>
		<link>http://www.numericalfactor.org/wp/archives/214</link>
		<comments>http://www.numericalfactor.org/wp/archives/214#comments</comments>
		<pubDate>Mon, 20 Aug 2007 16:02:48 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[algorithm]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[uva]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/214</guid>
		<description><![CDATA[UVAに送信してて思った．

手元ではコンパイル通る（-Wall付きで）のに，向こうではコンパイルエラー．
よく見ると必要なライブラリをincludeしてない，ということが最近よく起こりました．

なんで #includ [...]]]></description>
			<content:encoded><![CDATA[<p>UVAに送信してて思った．</p>

<p>手元ではコンパイル通る（-Wall付きで）のに，向こうではコンパイルエラー．
よく見ると必要なライブラリをincludeしてない，ということが最近よく起こりました．</p>

<p>なんで #include&lt;cstdio&gt; が無いのに，何の問題もなくsprintf使えてるんだ…みたいな．</p>

<pre><code>gcc (GCC) 4.1.2 (Ubuntu 4.1.2-0ubuntu4)
</code></pre>

<p>使ってるコンパイラはこれですが，こういうのをチェックするオプションって無いんでしょうか．
バージョンが違うと，こうも動作が違うものか…．</p>

<p>関係ないけど，<a href="http://acm.uva.es/p/v3/369.html">UVA369</a>がちょっと面白かった．</p>

<p>組合せ数<sub>N</sub>C<sub>M</sub>を出せという話なんですが，5 &#8806; N, M &#8806; 100．定義通り書くとすると <img src='http://www.numericalfactor.org/wp/wp-content/uploads/texclip20070821005022.png' alt='N!/( (N-M)! * M!)' /> を計算するけど，
100の階乗って10の150乗より大きい値（問題文に書いてある）なわけで．</p>

<p>これに対応するには? 任意精度の整数を使えば出来ます．
階乗にする数は高々100なので，
1!から100!まで配列に入れといて必要になったら呼び出せば毎回計算せずに済む．
あとは定義通りに計算でおkと．</p>

<p>で，多倍長整数を使いたくない場合，
というか多分期待されてる回答はこれだと思うのですが．</p>

<p>私も多倍長整数使いたくないので何かいい性質がないかと<a href="http://ja.wikipedia.org/wiki/%E7%B5%84%E5%90%88%E3%81%9B_%28%E6%95%B0%E5%AD%A6%29">組合せ (数学) &#8211; Wikipedia</a>
を読んでたら，ありました．つかこの程度の知識は持っとけと言われるかも．</p>

<p><img src='http://www.numericalfactor.org/wp/wp-content/uploads/texclip20070821005521.png' alt='{}_N \mathrm{C} _M = {}_{N-1} \mathrm{C} _M + {}_{N-1} \mathrm{C} _{M-1}' /></p>

<p>ある二つの組合せ数が分かってれば次の一つが計算できると．
というわけで次のようなN&times;Mの表を作ります．</p>

<table>
<thead>
<tr>
  <th>N\M</th>
  <th>1</th>
  <th>2</th>
  <th>3</th>
  <th>4</th>
  <th>5</th>
  <th>6</th>
  <th>7</th>
  <th>8</th>
</tr>
</thead>
<tbody>
<tr>
  <td>1</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>2</td>
  <td>2</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>3</td>
  <td>3</td>
  <td></td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>4</td>
  <td>4</td>
  <td></td>
  <td></td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>5</td>
  <td>5</td>
  <td></td>
  <td></td>
  <td></td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>6</td>
  <td>6</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td>1</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>7</td>
  <td>7</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td>1</td>
  <td></td>
</tr>
<tr>
  <td>8</td>
  <td>8</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td>1</td>
</tr>
</tbody>
</table>

<p><sub>N</sub>C<sub>N</sub>=1，<sub>N</sub>C<sub>1</sub>=nが分かればこれだけ埋められます．問題文にM &#8806; Nだと書いてある（組合せ数だからこれは当然）ので，表の左下三角部分だけ埋めれば良い．</p>

<p>ここでさっきの式が使えるわけですね．この表ではNは下方向に，Mは右方向に向かってそれぞれ増えていくので，式を当てはめると，あるセルAの上と左上のセルの値が分かればその和がセルAの値! という話になります．</p>

<table>
<thead>
<tr>
  <th>N\M</th>
  <th>1</th>
  <th>2</th>
  <th>3</th>
  <th>4</th>
  <th>5</th>
  <th>6</th>
  <th>7</th>
  <th>8</th>
</tr>
</thead>
<tbody>
<tr>
  <td>1</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>2</td>
  <td>2</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>3</td>
  <td>3</td>
  <td>3</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>4</td>
  <td>4</td>
  <td>6</td>
  <td>4</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>5</td>
  <td>5</td>
  <td>10</td>
  <td>10</td>
  <td>5</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>6</td>
  <td>6</td>
  <td>15</td>
  <td>20</td>
  <td>15</td>
  <td>6</td>
  <td>1</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>7</td>
  <td>7</td>
  <td>21</td>
  <td>35</td>
  <td></td>
  <td></td>
  <td></td>
  <td>1</td>
  <td></td>
</tr>
<tr>
  <td>8</td>
  <td>8</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td>1</td>
</tr>
</tbody>
</table>

<p>こんな感じ．上の解法とは違って和しかとらないので簡単．しかも問題文にあるように全ての計算がlongで収まるので多倍長の計算が不要．そしてN&times;Mは高々10,000でしかなく，和もその半分の回数程度しか計算しないので速い．</p>

<p>長々と書いたけど，おそらくこの問題やるような人であればほぼ確実に知ってそうな気がする．</p>

<p>Equation images by <a href="http://maru.bonyari.jp/texclip/">TexClip</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/214/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NECのロスレス画像圧縮技術</title>
		<link>http://www.numericalfactor.org/wp/archives/207</link>
		<comments>http://www.numericalfactor.org/wp/archives/207#comments</comments>
		<pubDate>Wed, 25 Jul 2007 14:25:34 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[algorithm]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/207</guid>
		<description><![CDATA[「NEC、圧縮速度を数十倍に高速化した&#8221;ロスレス画像圧縮&#8221;技術を開発」を参照．

最近の新しい画像圧縮技術といえば，


JPEG 2000
HD Photo(旧称: Windows Media  [...]]]></description>
			<content:encoded><![CDATA[<p>「<a href="http://journal.mycom.co.jp/news/2007/07/25/041/index.html">NEC、圧縮速度を数十倍に高速化した&#8221;ロスレス画像圧縮&#8221;技術を開発</a>」を参照．</p>

<p>最近の新しい画像圧縮技術といえば，</p>

<ul>
<li><a href="http://ja.wikipedia.org/wiki/JPEG_2000">JPEG 2000</a></li>
<li><a href="http://ja.wikipedia.org/wiki/HD_Photo">HD Photo</a>(旧称: Windows Media Photo), <a href="http://www.microsoft.com/japan/whdc/xps/WMPhoto.mspx">Spec</a></li>
</ul>

<p>あたりか．</p>

<p>今回NECが発表したのは自然画像に特化させてるのに対して上の二つは汎用だから微妙だけども，
一桁ぐらい速度が違う（ロスレスJPEG比）ってのはなかなかすごいんじゃないかと思うんだけど，
どうなんだろ．それともある分野に特化したらこの程度の事は出来るもんなのかな．</p>

<p>あとこの技術は公開されないのかな，ライブラリ化とかして．
JPEG 2000/HD Photoの現状からして，使われるかというと微妙だけど…．</p>

<p>ていうかHD Photoはどうでもいいとして，JPEG 2000は使われてるのかな．
ブラウザが対応してない以上，インターネットでは流通しなさそう．あるいはデジカメとか?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/207/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SRM354 DIV2</title>
		<link>http://www.numericalfactor.org/wp/archives/198</link>
		<comments>http://www.numericalfactor.org/wp/archives/198#comments</comments>
		<pubDate>Thu, 14 Jun 2007 16:35:52 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[algorithm]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[topcoder]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/198</guid>
		<description><![CDATA[TopCoder．最近は真面目に参加できてます．

250 点問題は， 3 つのカップのうち一つに小球を入れておき，二つのカップの位置を交換していって，最終的に小球の入ったカップはどの位置にあるか，という話．何も考えず， [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.topcoder.com/tc">TopCoder</a>．最近は真面目に参加できてます．</p>

<p>250 点問題は， 3 つのカップのうち一つに小球を入れておき，二つのカップの位置を交換していって，最終的に小球の入ったカップはどの位置にあるか，という話．何も考えず，入力ごとに swap して通った．</p>

<p>600 点問題は，月か日かが曖昧な日付たちを，mm/dd に直して与えられた順番のまま狭義単調増加に並べて辞書順で先頭になる文字列を出すとかいう話．最初に見た時よくわからなかったのでサクッと飛ばした．</p>

<p>1000 点問題は DP でした．
数字でパスワードを作るとき，パスワードの長さごとに何通りあるかを数える．
但しパスワードの作り方に制限があり，数字は特殊な並び方（テンキーみたいな感じ）をしていて，
ある数字の次は隣り合った数字のみ選べる，というもの．
ちょっと問題読んでみてこれが DP と気付いてからはこれをやるしかない! と一気に書いてました．</p>

<p>Code Phase 終わってからも DateFormat は良く分からず，600 点問題はやらなくてよかったーなんて思ってしまった．</p>

<p>今回で，初めて green coder になりました．</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/198/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>uva117</title>
		<link>http://www.numericalfactor.org/wp/archives/193</link>
		<comments>http://www.numericalfactor.org/wp/archives/193#comments</comments>
		<pubDate>Mon, 28 May 2007 04:19:33 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[algorithm]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[uva]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/193</guid>
		<description><![CDATA[UVA の The Postal Worker Rings Once を解いた．

題意は，与えられた連結グラフにおいて，全ての辺を少なくとも一度通る閉路のうち最小となるコストを出力せよ．

ただし奇数次の頂点は高々 2 [...]]]></description>
			<content:encoded><![CDATA[<p>UVA の <a href="http://acm.uva.es/p/v1/117.html">The Postal Worker Rings Once</a> を解いた．</p>

<p>題意は，与えられた連結グラフにおいて，全ての辺を少なくとも一度通る閉路のうち最小となるコストを出力せよ．</p>

<p>ただし奇数次の頂点は高々 2 つ．</p>

<p>サンプル入力のグラフを図にするとこんな感じ:
<a href='http://www.numericalfactor.org/wp/wp-content/uploads/uva117_2.png' title='uva117' rel="lightbox"><img src='http://www.numericalfactor.org/wp/wp-content/uploads/uva117.png' alt='uva117.png' /></a></p>

<p>だいぶバグって情けない感じだったけど，通しました．
まず入力をコード上で使い易い形に落とすのが面倒だった…．</p>

<p>さて，「奇数次の頂点が高々2つ」という条件がキモ．つまり与えられるグラフは（準）オイラーグラフ．</p>

<p>ということで，グラフの種類により場合分けすれば良い．</p>

<dl>
<dt>オイラーグラフ</dt>
<dd>ある頂点から始めて全ての辺を通りそこに戻ってくる一筆書きがある．つまり，全ての辺のコストの和が答え．</dd>

<dt>準オイラーグラフ</dt>
<dd>2 つの奇数次の頂点を v1, v2 とすると，v1から始めて全ての辺を通りv2に至るような一筆書きがある．つまり，（v1からv2へ至る一筆書き + v2からv1への最短経路）の総コストが答え．</dd>
</dl>

<p>オイラーグラフなら全ての頂点は偶数次だし，準オイラーグラフなら奇数次の頂点が二つ，という点で判定できる．</p>

<p>奇数次の頂点が1つということはない．これは，連結グラフだし，問題文で「ある頂点から出てそこにまた入る辺は存在しないし，任意の2頂点間を直接繋ぐ辺は高々一つ，任意の2頂点間を繋ぐパスが存在する」と言っている．直感的には，上の条件から，グラフに辺を一つ追加したら互いに異なる2つの頂点の次数がそれぞれ 1 増えるので，ある頂点が奇数次なら必ずもう一つ奇数次の頂点が存在する，という感じでしょうか．</p>

<p>書いたダイクストラ法がバグってて，数回 Wrong Answer 喰らってしまった．</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/193/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>構文解析</title>
		<link>http://www.numericalfactor.org/wp/archives/175</link>
		<comments>http://www.numericalfactor.org/wp/archives/175#comments</comments>
		<pubDate>Thu, 05 Apr 2007 10:43:26 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[algorithm]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/175</guid>
		<description><![CDATA[今日は久しぶりにコードを書いた。
そして今まで敬遠してきた構文解析を勉強。

tanakhさんという方が「10分で書ける、お手軽パーザー」を公開されているので、これをもとに PKU の 1460 Firefighters [...]]]></description>
			<content:encoded><![CDATA[<p>今日は久しぶりにコードを書いた。
そして今まで敬遠してきた構文解析を勉強。</p>

<p><a href="http://d.hatena.ne.jp/tanakh/">tanakh</a>さんという方が「<a href="http://fxp.hp.infoseek.co.jp/arti/parser.html">10分で書ける、お手軽パーザー</a>」を公開されているので、これをもとに PKU の <a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1460">1460 Firefighters</a> を解きました。</p>

<p>問題を解くにあたっては、キモとなる部分は出来ているので流用させてもらい（まんまパクリだ）、エラー処理と式を作るとこだけ書きました。それでも解けずに数十分悩んでたあたりダメダメだ…。あと int じゃ足りないかと思って long long にしたのは無駄だった。</p>

<p>問題内容は、式と整数値が与えられるので、式を計算したらその整数値になるかどうか判定しろという話。ただし、一部の演算子が <code>?</code> になっていることがあり、ここには <code>+ - * /</code> のどれが入るか分からない。そこでどれかを入れて一つでも式の値が与えられた整数値に一致すれば良しとする。一つの式に <code>?</code> は最大 10 個まで存在し得る（→全探索。 4<sup>10</sup> = 2<sup>20</sup> で約 100 万だし）。</p>

<p>シンタックスエラーは無いと問題文で述べてるので、気を付けるのはゼロ割りなどのエラー対処くらい。でも、「parsed 型の解析し残した文字列が NULL の時はエラー」という扱いで書いてたんですが、これを一ヶ所だけチェックし忘れていたせいで何度も RE …という感じでハマりました。</p>

<p>確か数年前の ICPC 国内大会で、原子量と分子式から分子量を計算しろという問題があったと思うので、近いうちにやっておこう…。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/175/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>細線化と凸包</title>
		<link>http://www.numericalfactor.org/wp/archives/145</link>
		<comments>http://www.numericalfactor.org/wp/archives/145#comments</comments>
		<pubDate>Sun, 31 Dec 2006 14:54:42 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[algorithm]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/145</guid>
		<description><![CDATA[
Hilditch&#8217;s Algorithm for Skeletonization
Convex Hull &#8211; Algorithmist
凸包 (Andrew&#8217;s Monotone C [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://jeff.cs.mcgill.ca/~godfried/teaching/projects97/azar/skeleton.html">Hilditch&#8217;s Algorithm for Skeletonization</a></li>
<li><a href="http://www.algorithmist.com/index.php/Convex_Hull">Convex Hull &#8211; Algorithmist</a></li>
<li><a href="http://www.prefield.com/algorithm/geometry/convex_hull.html">凸包 (Andrew&#8217;s Monotone Chain) &#8211; Spaghetti Source</a></li>
</ul>

<p>両者はまったく関係ないですが、必要だったのでメモ。</p>

<p>細線化（Thinning, Skeletonization）は他にもアルゴリズムはあったけど、
線の端が Y の字のように分かれてしまうものが多かったので。
上で挙げた文書にある通り、 Hilditch のアルゴリズムではダメな場合があるらしいと
いうことは覚えておこう。今回は充分に用は足りたけど。</p>

<p>凸包（Convex Hull）は今後も必要そうだから少しがんばってみた（?）。
分かり易そうだったので Graham Scan を使ってみました。</p>

<p>Cで書くのはちょっとつらかったです。（何</p>

<p>という感じで 2006 年は終わりであった。<a href="http://keith.weblogs.jp/cyberspace/">電脳空間カウボーイズ</a>聴いたら寝るよ!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/145/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
