锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍥犱負鎵鏈夌畝鍗曞杈瑰艦閮藉彲鍒囧壊涓轟竴涓?a title=涓夎褰?>涓夎褰?/font>鍜屽彟涓涓畝鍗曞杈瑰艦銆傝冭檻涓涓畝鍗曞杈瑰艦P錛屽強璺?em>P鏈変竴鏉″叡鍚岃竟鐨勪笁瑙掑艦T銆傝嫢P絎﹀悎鐨厠鍏紡錛屽垯鍙璇佹槑P鍔犱笂T鐨?em>PT浜︾鍚堢毊鍏嬪叕寮忥紙I錛夛紝涓庡強涓夎褰㈢鍚堢毊鍏嬪叕寮忥紙II錛夛紝灝卞彲鏍規(guī)嵁鏁板褰掔撼娉?/font>錛屽浜庢墍鏈夌畝鍗曞杈瑰艦鐨厠鍏紡閮芥槸鎴愮珛鐨勩?
璁?em>P鍜?em>T鐨勫叡鍚岃竟涓婃湁c涓牸鐐廣?
璇佹槑鍒嗕笁閮ㄥ垎錛氳瘉鏄庝互涓嬬殑鍥懼艦絎﹀悎鐨厠瀹氱悊錛?
璁劇煩褰?em>R闀胯竟鐭竟鍚勬湁m,n涓牸鐐癸細
鏄撹涓ゆ潯閭昏竟鍜?a title=灝嶈綬?>瀵硅綰?/font>緇勬垚鐨勪袱涓洿瑙掍笁瑙掑艦鍏ㄧ瓑錛屼笖i,b鐩哥瓑銆傝鍏舵枩杈逛笂鏈?em>c涓牸鐐廣?
Georg Alexander Pick錛?a title=1859騫?>1859騫?/font>鐢熶簬緇翠篃綰?/font>錛?a title=1943騫?>1943騫?/font>姝諱簬鐗硅幈瑗挎仼鏂藉鐗歸泦涓惀銆?
en:Pick's theorem fr:Théorème de Pick it:Teorema di Pick pl:Wzór Picka ru:孝械芯褉械屑邪 袩懈瀉邪

鍒ゆ柇鐐規(guī)槸鍚﹀湪綰挎涓婏細
銆銆璁劇偣涓篞錛岀嚎孌典負P1P2 錛屽垽鏂偣Q鍦ㄨ綰挎涓婄殑渚濇嵁鏄細( Q - P1 ) × ( P2 - P1 ) = 0 涓?Q 鍦ㄤ互 P1錛孭2涓哄瑙掗《鐐圭殑鐭╁艦鍐呫傚墠鑰呬繚璇丵鐐瑰湪鐩寸嚎P1P2涓婏紝鍚庤呮槸淇濊瘉Q鐐逛笉鍦ㄧ嚎孌礟1P2鐨勫歡闀跨嚎鎴栧弽鍚戝歡闀跨嚎涓婏紝瀵逛簬榪欎竴姝ラ鐨勫垽鏂彲浠ョ敤浠ヤ笅榪囩▼瀹炵幇錛?br>
銆銆ON-SEGMENT(pi,pj,pk)
銆銆if min(xi,xj)<=xk<=max(xi,xj) and min(yi,yj)<=yk<=max(yi,yj)
銆銆then return true;
銆銆else return false;
銆銆鐗瑰埆瑕佹敞鎰忕殑鏄紝鐢變簬闇瑕佽冭檻姘村鉤綰挎鍜屽瀭鐩寸嚎孌典袱縐嶇壒孌婃儏鍐碉紝min(xi,xj)<=xk<=max(xi,xj)鍜宮in(yi,yj)<=yk<=max(yi,yj)涓や釜鏉′歡蹇呴』鍚屾椂婊¤凍鎵嶈兘榪斿洖鐪熷箋?br>
鍒ゆ柇涓ょ嚎孌墊槸鍚︾浉浜わ細
鎴戜滑鍒嗕袱姝ョ‘瀹氫袱鏉$嚎孌墊槸鍚︾浉浜わ細
銆銆(1)蹇熸帓鏂ヨ瘯楠?br>
銆銆璁句互綰挎 P1P2 涓哄瑙掔嚎鐨勭煩褰負R錛?璁句互綰挎 Q1Q2 涓哄瑙掔嚎鐨勭煩褰負T錛屽鏋淩鍜孴涓嶇浉浜わ紝鏄劇劧涓ょ嚎孌典笉浼氱浉浜ゃ?br>
銆銆(2)璺ㄧ珛璇曢獙
銆銆濡傛灉涓ょ嚎孌電浉浜わ紝鍒欎袱綰挎蹇呯劧鐩鎬簰璺ㄧ珛瀵規(guī)柟銆傝嫢P1P2璺ㄧ珛Q1Q2 錛屽垯鐭㈤噺 ( P1 - Q1 ) 鍜? P2 - Q1 )浣嶄簬鐭㈤噺( Q2 - Q1 ) 鐨勪袱渚э紝鍗? P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0銆備笂寮忓彲鏀瑰啓鎴? P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0銆傚綋 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 鏃訛紝璇存槑 ( P1 - Q1 ) 鍜?( Q2 - Q1 )鍏辯嚎錛屼絾鏄洜涓哄凡緇忛氳繃蹇熸帓鏂ヨ瘯楠岋紝鎵浠?P1 涓瀹氬湪綰挎 Q1Q2涓婏紱鍚岀悊錛? Q2 - Q1 ) ×(P2 - Q1 ) = 0 璇存槑 P2 涓瀹氬湪綰挎 Q1Q2涓娿傛墍浠ュ垽鏂璓1P2璺ㄧ珛Q1Q2鐨勪緷鎹槸錛? P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0銆傚悓鐞嗗垽鏂璔1Q2璺ㄧ珛P1P2鐨勪緷鎹槸錛? Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0銆傚叿浣撴儏鍐靛涓嬪浘鎵紺猴細

鍦ㄧ浉鍚岀殑鍘熺悊涓嬶紝瀵規(guī)綆楁硶鐨勫叿浣撶殑瀹炵幇緇嗚妭鍙兘浼氫笌姝ゆ湁鎵涓嶅悓錛岄櫎浜嗚繖縐嶈繃紼嬪錛屽ぇ瀹朵篃鍙互鍙傝冦婄畻娉曞璁恒嬩笂鐨勫疄鐜般?br> 涓轟簡緇熶竴璧瘋錛屾垜浠湪璁$畻灝勭嚎L鍜屽杈瑰艦鐨勪氦鐐圭殑鏃跺欙紝1銆傚浜庡杈瑰艦鐨勬按騫寵竟涓嶄綔鑰冭檻錛?銆傚浜庡杈瑰艦鐨勯《鐐瑰拰L鐩鎬氦鐨勬儏鍐碉紝濡傛灉璇ラ《鐐規(guī)槸鍏舵墍灞炵殑杈逛笂綰靛潗鏍囪緝澶х殑欏剁偣錛屽垯璁℃暟錛屽惁鍒欏拷鐣ワ紱3銆傚浜嶱鍦ㄥ杈瑰艦杈逛笂鐨勬儏褰紝鐩存帴鍙垽鏂璓灞炰簬澶氳竟琛屻傜敱姝ゅ緱鍑虹畻娉曠殑浼唬鐮佸涓嬶細 鍥犳鎴戜滑鍙互鍏堟眰鍑烘墍鏈夊拰綰挎鐩鎬氦鐨勫杈瑰艦鐨勯《鐐癸紝鐒跺悗鎸夌収X-Y鍧愭爣鎺掑簭(X鍧愭爣灝忕殑鎺掑湪鍓嶉潰錛屽浜嶺鍧愭爣鐩稿悓鐨勭偣錛孻鍧愭爣灝忕殑鎺掑湪鍓嶉潰錛岃繖縐嶆帓搴忓噯鍒欎篃鏄負浜嗕繚璇佹按騫沖拰鍨傜洿鎯呭喌鐨勫垽鏂紜?錛岃繖鏍風浉閭?cè)潥勪袱涓偣灏辨槸鍦ňU挎涓婄浉閭?cè)潥勪袱浜ょ偣锛屽鏋滀焕L剰鐩擱偦涓ょ偣鐨勪腑鐐逛篃鍦ㄥ杈瑰艦鍐咃紝鍒欒綰挎涓瀹氬湪澶氳竟褰㈠唴銆? 璁$畻綰挎鎴栫洿綰夸笌綰挎鐨勪氦鐐? 鍑稿寘鐨勬眰娉曪細
鍒ゆ柇綰挎鍜岀洿綰挎槸鍚︾浉浜わ細
鏈変簡涓婇潰鐨勫熀紜錛岃繖涓畻娉曞氨寰堝鏄撲簡銆傚鏋滅嚎孌礟1P2鍜岀洿綰縌1Q2鐩鎬氦錛屽垯P1P2璺ㄧ珛Q1Q2錛屽嵆錛? P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0銆?br>
鍒ゆ柇鐭╁艦鏄惁鍖呭惈鐐癸細
鍙鍒ゆ柇璇ョ偣鐨勬í鍧愭爣鍜岀旱鍧愭爣鏄惁澶瑰湪鐭╁艦鐨勫乏鍙寵竟鍜屼笂涓嬭竟涔嬮棿銆?br>
鍒ゆ柇綰挎銆佹姌綰褲佸杈瑰艦鏄惁鍦ㄧ煩褰腑錛?/strong>
鍥犱負鐭╁艦鏄釜鍑擱泦錛屾墍浠ュ彧瑕佸垽鏂墍鏈夌鐐規(guī)槸鍚﹂兘鍦ㄧ煩褰腑灝卞彲浠ヤ簡銆?br>
鍒ゆ柇鐭╁艦鏄惁鍦ㄧ煩褰腑錛?/strong>
鍙姣旇緝宸﹀彸杈圭晫鍜屼笂涓嬭竟鐣屽氨鍙互浜嗐?br>
鍒ゆ柇鍦嗘槸鍚﹀湪鐭╁艦涓細
寰堝鏄撹瘉鏄庯紝鍦嗗湪鐭╁艦涓殑鍏呰鏉′歡鏄細鍦嗗績鍦ㄧ煩褰腑涓斿渾鐨勫崐寰勫皬浜庣瓑浜庡渾蹇冨埌鐭╁艦鍥涜竟鐨勮窛紱葷殑鏈灝忓箋?br>
鍒ゆ柇鐐規(guī)槸鍚﹀湪澶氳竟褰腑錛?/strong>
銆銆鍒ゆ柇鐐筆鏄惁鍦ㄥ杈瑰艦涓槸璁$畻鍑犱綍涓竴涓潪甯稿熀鏈絾鏄崄鍒嗛噸瑕佺殑綆楁硶銆備互鐐筆涓虹鐐癸紝鍚戝乏鏂逛綔灝勭嚎L錛岀敱浜庡杈瑰艦鏄湁鐣岀殑錛屾墍浠ュ皠綰縇鐨勫乏绔竴瀹氬湪澶氳竟褰㈠錛岃冭檻娌跨潃L浠庢棤絀瘋繙澶勫紑濮嬭嚜宸﹀悜鍙崇Щ鍔紝閬囧埌鍜屽杈瑰艦鐨勭涓涓氦鐐圭殑鏃跺欙紝榪涘叆鍒頒簡澶氳竟褰㈢殑鍐呴儴錛岄亣鍒扮浜屼釜浜ょ偣鐨勬椂鍊欙紝紱誨紑浜嗗杈瑰艦錛?#8230;…鎵浠ュ緢瀹規(guī)槗鐪嬪嚭褰揕鍜屽杈瑰艦鐨勪氦鐐規(guī)暟鐩瓹鏄鏁扮殑鏃跺欙紝P鍦ㄥ杈瑰艦鍐咃紝鏄伓鏁扮殑璇漃鍦ㄥ杈瑰艦澶栥?br>
銆銆浣嗘槸鏈変簺鐗規(guī)畩鎯呭喌瑕佸姞浠ヨ冭檻銆傚鍥句笅鍥?a)(b)(c)(d)鎵紺恒傚湪鍥?a)涓紝L鍜屽杈瑰艦鐨勯《鐐圭浉浜わ紝榪欐椂鍊欎氦鐐瑰彧鑳借綆椾竴涓紱鍦ㄥ浘(b)涓紝L鍜屽杈瑰艦欏剁偣鐨勪氦鐐逛笉搴旇璁$畻錛涘湪鍥?c)鍜?d) 涓紝L鍜屽杈瑰艦鐨勪竴鏉¤竟閲嶅悎錛岃繖鏉¤竟搴旇琚拷鐣ヤ笉璁°傚鏋淟鍜屽杈瑰艦鐨勪竴鏉¤竟閲嶅悎錛岃繖鏉¤竟搴旇琚拷鐣ヤ笉璁°?/p>

銆銆count ← 0;
銆銆浠涓虹鐐癸紝浣滀粠鍙沖悜宸︾殑灝勭嚎L;
銆銆for 澶氳竟褰㈢殑姣忔潯杈箂
銆銆do if P鍦ㄨ竟s涓?
銆銆then return true;
銆銆if s涓嶆槸姘村鉤鐨?br>銆銆then if s鐨勪竴涓鐐瑰湪L涓?br>銆銆if 璇ョ鐐規(guī)槸s涓ょ鐐逛腑綰靛潗鏍囪緝澶х殑绔偣
銆銆then count ← count+1
銆銆else if s鍜孡鐩鎬氦
銆銆then count ← count+1;
銆銆if count mod 2 = 1
銆銆then return true;
銆銆else return false;
銆銆鍏朵腑鍋氬皠綰縇鐨勬柟娉曟槸錛氳P'鐨勭旱鍧愭爣鍜孭鐩稿悓錛屾í鍧愭爣涓烘鏃犵┓澶э紙寰堝ぇ鐨勪竴涓鏁幫級錛屽垯P鍜孭'灝辯‘瀹氫簡灝勭嚎L銆?
銆銆鍒ゆ柇鐐規(guī)槸鍚﹀湪澶氳竟褰腑鐨勮繖涓畻娉曠殑鏃墮棿澶嶆潅搴︿負O(n)銆?br>
銆銆鍙﹀榪樻湁涓縐嶇畻娉曟槸鐢ㄥ甫絎﹀彿鐨勪笁瑙掑艦闈㈢Н涔嬪拰涓庡杈瑰艦闈㈢Н榪涜姣旇緝錛岃繖縐嶇畻娉曠敱浜庝嬌鐢ㄦ誕鐐規(guī)暟榪愮畻鎵浠ヤ細甯︽潵涓瀹氳宸紝涓嶆帹鑽愬ぇ瀹朵嬌鐢ㄣ?
鍒ゆ柇綰挎鏄惁鍦ㄥ杈瑰艦鍐咃細
銆銆綰挎鍦ㄥ杈瑰艦鍐呯殑涓涓繀瑕佹潯浠舵槸綰挎鐨勪袱涓鐐歸兘鍦ㄥ杈瑰艦鍐咃紝浣嗙敱浜庡杈瑰艦鍙兘涓哄嚬錛屾墍浠ヨ繖涓嶈兘鎴愪負鍒ゆ柇鐨勫厖鍒嗘潯浠躲傚鏋滅嚎孌靛拰澶氳竟褰㈢殑鏌愭潯杈瑰唴浜わ紙涓ょ嚎孌靛唴浜ゆ槸鎸囦袱綰挎鐩鎬氦涓斾氦鐐逛笉鍦ㄤ袱綰挎鐨勭鐐癸級錛屽洜涓哄杈瑰艦鐨勮竟鐨勫乏鍙充袱渚у垎灞炲杈瑰艦鍐呭涓嶅悓閮ㄥ垎錛屾墍浠ョ嚎孌典竴瀹氫細鏈変竴閮ㄥ垎鍦ㄥ杈瑰艦澶?瑙佸浘a)銆備簬鏄垜浠緱鍒扮嚎孌靛湪澶氳竟褰㈠唴鐨勭浜屼釜蹇呰鏉′歡錛氱嚎孌靛拰澶氳竟褰㈢殑鎵鏈夎竟閮戒笉鍐呬氦銆?
銆銆綰挎鍜屽杈瑰艦浜や簬綰挎鐨勪袱绔偣騫朵笉浼氬獎鍝嶇嚎孌墊槸鍚﹀湪澶氳竟褰㈠唴錛涗絾鏄鏋滃杈瑰艦鐨勬煇涓《鐐瑰拰綰挎鐩鎬氦錛岃繕蹇呴』鍒ゆ柇涓ょ浉閭諱氦鐐逛箣闂寸殑綰挎鏄惁鍖呭惈浜庡杈瑰艦鍐呴儴錛堝弽渚嬭鍥綽)銆?/p>

銆銆璇佹槑濡備笅錛?br>
銆銆鍛介1錛?br>
銆銆濡傛灉綰挎鍜屽杈瑰艦鐨勪袱鐩擱偦浜ょ偣P1 錛孭2鐨勪腑鐐筆' 涔熷湪澶氳竟褰㈠唴錛屽垯P1, P2涔嬮棿鐨勬墍鏈夌偣閮藉湪澶氳竟褰㈠唴銆?br>
銆銆璇佹槑錛?br>
銆銆鍋囪P1,P2涔嬮棿鍚湁涓嶅湪澶氳竟褰㈠唴鐨勭偣錛屼笉濡ㄨ璇ョ偣涓篞錛屽湪P1, P'涔嬮棿錛屽洜涓哄杈瑰艦鏄棴鍚堟洸綰匡紝鎵浠ュ叾鍐呭閮ㄤ箣闂存湁鐣岋紝鑰孭1灞炰簬澶氳竟琛屽唴閮紝Q灞炰簬澶氳竟鎬у閮紝P'灞炰簬澶氳竟鎬у唴閮紝P1-Q-P'瀹屽叏榪炵畫錛屾墍浠1Q鍜孮P'涓瀹氳法瓚婂杈瑰艦鐨勮竟鐣岋紝鍥犳鍦≒1,P'涔嬮棿鑷沖皯榪樻湁涓や釜璇ョ嚎孌靛拰澶氳竟褰㈢殑浜ょ偣錛岃繖鍜孭1P2鏄浉閭諱袱浜ょ偣鐭涚浘錛屾晠鍛介鎴愮珛銆傝瘉姣曘?
銆銆鐢卞懡棰?鐩存帴鍙緱鍑烘帹璁猴細
銆銆鎺ㄨ2錛?br>
銆銆璁懼杈瑰艦鍜岀嚎孌礟Q鐨勪氦鐐逛緷嬈′負P1,P2,……Pn錛屽叾涓璓i鍜孭i+1鏄浉閭諱袱浜ょ偣錛岀嚎孌礟Q鍦ㄥ杈瑰艦鍐呯殑鍏呰鏉′歡鏄細P錛孮鍦ㄥ杈瑰艦鍐呬笖瀵逛簬i =1, 2,……, n-1錛孭i ,Pi+1鐨勪腑鐐逛篃鍦ㄥ杈瑰艦鍐呫?br>
銆銆鍦ㄥ疄闄呯紪紼嬩腑錛屾病鏈夊繀瑕佽綆楁墍鏈夌殑浜ょ偣錛岄鍏堝簲鍒ゆ柇綰挎鍜屽杈瑰艦鐨勮竟鏄惁鍐呬氦錛屽樿嫢綰挎鍜屽杈瑰艦鐨勬煇鏉¤竟鍐呬氦鍒欑嚎孌典竴瀹氬湪澶氳竟褰㈠錛涘鏋滅嚎孌靛拰澶氳竟褰㈢殑姣忎竴鏉¤竟閮戒笉鍐呬氦錛屽垯綰挎鍜屽杈瑰艦鐨勪氦鐐逛竴瀹氭槸綰挎鐨勭鐐規(guī)垨鑰呭杈瑰艦鐨勯《鐐癸紝鍙鍒ゆ柇鐐規(guī)槸鍚﹀湪綰挎涓婂氨鍙互浜嗐?br>
銆銆鑷蟲鎴戜滑寰楀嚭綆楁硶濡備笅錛?br>
銆銆if 綰跨PQ鐨勭鐐逛笉閮藉湪澶氳竟褰㈠唴
銆銆then return false;
銆銆鐐歸泦pointSet鍒濆鍖栦負絀?
銆銆for 澶氳竟褰㈢殑姣忔潯杈箂
銆銆do if 綰挎鐨勬煇涓鐐瑰湪s涓?br>銆銆then 灝嗚绔偣鍔犲叆pointSet;
銆銆else if s鐨勬煇涓鐐瑰湪綰挎PQ涓?br>銆銆then 灝嗚绔偣鍔犲叆pointSet;
銆銆else if s鍜岀嚎孌礟Q鐩鎬氦 // 榪欐椂鍊欏凡緇忓彲浠ヨ偗瀹氭槸鍐呬氦浜?br>銆銆then return false;
銆銆灝唒ointSet涓殑鐐規(guī)寜鐓-Y鍧愭爣鎺掑簭;
銆銆for pointSet涓瘡涓や釜鐩擱偦鐐?pointSet[i] , pointSet[ i+1]
銆銆do if pointSet[i] , pointSet[ i+1] 鐨勪腑鐐逛笉鍦ㄥ杈瑰艦涓?br>銆銆then return false;
銆銆return true;
銆銆榪欎釜榪囩▼涓殑鎺掑簭鍥犱負浜ょ偣鏁扮洰鑲畾榪滃皬浜庡杈瑰艦鐨勯《鐐規(guī)暟鐩畁錛屾墍浠ユ渶澶氭槸甯告暟綰х殑澶嶆潅搴︼紝鍑犱箮鍙互蹇界暐涓嶈銆傚洜姝ょ畻娉曠殑鏃墮棿澶嶆潅搴︿篃鏄疧(n)銆?
鍒ゆ柇鎶樼嚎鏄惁鍦ㄥ杈瑰艦鍐咃細
銆銆鍙鍒ゆ柇鎶樼嚎鐨勬瘡鏉$嚎孌墊槸鍚﹂兘鍦ㄥ杈瑰艦鍐呭嵆鍙傝鎶樼嚎鏈塵鏉$嚎孌碉紝澶氳竟褰㈡湁n涓《鐐癸紝鍒欒綆楁硶鐨勬椂闂村鏉傚害涓篛(m*n)銆?
銆鍒ゆ柇澶氳竟褰㈡槸鍚﹀湪澶氳竟褰㈠唴錛?
銆銆鍙鍒ゆ柇澶氳竟褰㈢殑姣忔潯杈規(guī)槸鍚﹂兘鍦ㄥ杈瑰艦鍐呭嵆鍙傚垽鏂竴涓湁m涓《鐐圭殑澶氳竟褰㈡槸鍚﹀湪涓涓湁n涓《鐐圭殑澶氳竟褰㈠唴澶嶆潅搴︿負O(m*n)銆?br>
銆銆鍒ゆ柇鐭╁艦鏄惁鍦ㄥ杈瑰艦鍐咃細
灝嗙煩褰㈣漿鍖栦負澶氳竟褰紝鐒跺悗鍐嶅垽鏂槸鍚﹀湪澶氳竟褰㈠唴銆?
鍒ゆ柇鍦嗘槸鍚﹀湪澶氳竟褰㈠唴錛?/strong>
銆銆鍙璁$畻鍦嗗績鍒板杈瑰艦鐨勬瘡鏉¤竟鐨勬渶鐭窛紱伙紝濡傛灉璇ヨ窛紱誨ぇ浜庣瓑浜庡渾鍗婂緞鍒欒鍦嗗湪澶氳竟褰㈠唴銆傝綆楀渾蹇冨埌澶氳竟褰㈡瘡鏉¤竟鏈鐭窛紱葷殑綆楁硶鍦ㄥ悗鏂囬槓榪般?
鍒ゆ柇鐐規(guī)槸鍚﹀湪鍦嗗唴錛?/strong>
璁$畻鍦嗗績鍒拌鐐圭殑璺濈錛屽鏋滃皬浜庣瓑浜庡崐寰勫垯璇ョ偣鍦ㄥ渾鍐呫?br>
鍒ゆ柇綰挎銆佹姌綰褲佺煩褰€佸杈瑰艦鏄惁鍦ㄥ渾鍐?
鍥犱負鍦嗘槸鍑擱泦錛屾墍浠ュ彧瑕佸垽鏂槸鍚︽瘡涓《鐐歸兘鍦ㄥ渾鍐呭嵆鍙?
鍒ゆ柇鍦嗘槸鍚﹀湪鍦嗗唴錛?/strong>
銆璁句袱鍦嗕負O1,O2錛屽崐寰勫垎鍒負r1, r2錛岃鍒ゆ柇O2鏄惁鍦∣1鍐呫傚厛姣旇緝r1錛宺2鐨勫ぇ灝忥紝濡傛灉r1<r2鍒橭2涓嶅彲鑳藉湪O1鍐咃紱鍚﹀垯濡傛灉涓ゅ渾蹇冪殑璺濈澶т簬r1 - r2 錛屽垯O2涓嶅湪O1鍐咃紱鍚﹀垯O2鍦∣1鍐呫?
璁$畻鐐瑰埌綰挎鐨勬渶榪戠偣錛?/strong>
銆銆濡傛灉璇ョ嚎孌靛鉤琛屼簬X杞達紙Y杞達級錛屽垯榪囩偣point浣滆綰挎鎵鍦ㄧ洿綰跨殑鍨傜嚎錛屽瀭瓚沖緢瀹規(guī)槗姹傚緱錛岀劧鍚庤綆楀嚭鍨傝凍錛屽鏋滃瀭瓚沖湪綰挎涓婂垯榪斿洖鍨傝凍錛屽惁鍒欒繑鍥炵鍨傝凍榪戠殑绔偣錛涘鏋滆綰挎涓嶅鉤琛屼簬X杞翠篃涓嶅鉤琛屼簬Y杞達紝鍒欐枩鐜囧瓨鍦ㄤ笖涓嶄負0銆傝綰挎鐨勪袱绔偣涓簆t1鍜宲t2錛屾枩鐜囦負錛歬 = ( pt2.y - pt1. y ) / (pt2.x - pt1.x );璇ョ洿綰挎柟紼嬩負錛歽 = k* ( x - pt1.x) + pt1.y銆傚叾鍨傜嚎鐨勬枩鐜囦負 - 1 / k錛屽瀭綰挎柟紼嬩負錛歽 = (-1/k) * (x - point.x) + point.y 銆?
銆銆鑱旂珛涓ょ洿綰挎柟紼嬭В寰楋細x = ( k^2 * pt1.x + k * (point.y - pt1.y ) + point.x ) / ( k^2 + 1) 錛寉 = k * ( x - pt1.x) + pt1.y;鐒跺悗鍐嶅垽鏂瀭瓚蟲槸鍚﹀湪綰挎涓婏紝濡傛灉鍦ㄧ嚎孌典笂鍒欒繑鍥炲瀭瓚籌紱濡傛灉涓嶅湪鍒欒綆椾袱绔偣鍒板瀭瓚崇殑璺濈錛岄夋嫨璺濈鍨傝凍杈冭繎鐨勭鐐硅繑鍥炪?
璁$畻鐐瑰埌鎶樼嚎銆佺煩褰€佸杈瑰艦鐨勬渶榪戠偣錛?/strong>
鍙鍒嗗埆璁$畻鐐瑰埌姣忔潯綰挎鐨勬渶榪戠偣錛岃褰曟渶榪戣窛紱伙紝鍙栧叾涓渶榪戣窛紱繪渶灝忕殑鐐瑰嵆鍙?
璁$畻鐐瑰埌鍦嗙殑鏈榪戣窛紱誨強浜ょ偣鍧愭爣錛?/strong>
銆銆濡傛灉璇ョ偣鍦ㄥ渾蹇冿紝鍥犱負鍦嗗績鍒板渾鍛ㄤ換涓鐐圭殑璺濈鐩哥瓑錛岃繑鍥濽NDEFINED銆?
銆銆榪炴帴鐐筆鍜屽渾蹇僌錛屽鏋淧O騫寵浜嶺杞達紝鍒欐牴鎹甈鍦∣鐨勫乏杈硅繕鏄彸杈硅綆楀嚭鏈榪戠偣鐨勬í鍧愭爣涓篶enterPoint.x - radius 鎴?centerPoint.x + radius銆傚鏋淧O騫寵浜嶻杞達紝鍒欐牴鎹甈鍦∣鐨勪笂杈硅繕鏄笅杈硅綆楀嚭鏈榪戠偣鐨勭旱鍧愭爣涓?centerPoint.y -+radius鎴?centerPoint.y - radius銆傚鏋淧O涓嶅鉤琛屼簬X杞村拰Y杞達紝鍒橮O鐨勬枩鐜囧瓨鍦ㄤ笖涓嶄負0錛岃繖鏃剁洿綰縋O鏂滅巼涓簁 = 錛?P.y - O.y 錛? ( P.x - O.x )銆傜洿綰縋O鐨勬柟紼嬩負錛歽 = k * ( x - P.x) + P.y銆傝鍦嗘柟紼嬩負:(x - O.x ) ^2 + ( y - O.y ) ^2 = r ^2錛岃仈绔嬩袱鏂圭▼緇勫彲浠ヨВ鍑虹洿綰縋O鍜屽渾鐨勪氦鐐癸紝鍙栧叾涓P鐐硅緝榪戠殑浜ょ偣鍗沖彲銆?
璁$畻涓ゆ潯鍏辯嚎鐨勭嚎孌電殑浜ょ偣錛?/strong>
銆銆瀵逛簬涓ゆ潯鍏辯嚎鐨勭嚎孌碉紝瀹冧滑涔嬮棿鐨勪綅緗叧緋繪湁涓嬪浘鎵紺虹殑鍑犵鎯呭喌銆傚浘(a)涓袱鏉$嚎孌墊病鏈変氦鐐癸紱鍥?(b) 鍜?(d) 涓袱鏉$嚎孌墊湁鏃犵┓鐒︾偣錛涘浘 (c) 涓袱鏉$嚎孌墊湁涓涓氦鐐廣傝line1鏄袱鏉$嚎孌典腑杈冮暱鐨勪竴鏉★紝line2鏄緝鐭殑涓鏉★紝濡傛灉line1鍖呭惈浜唋ine2鐨勪袱涓鐐癸紝鍒欐槸鍥?d)鐨勬儏鍐碉紝涓ょ嚎孌墊湁鏃犵┓浜ょ偣錛涘鏋渓ine1鍙寘鍚玪ine2鐨勪竴涓鐐癸紝閭d箞濡傛灉line1鐨勬煇涓鐐圭瓑浜庤line1鍖呭惈鐨刲ine2鐨勯偅涓鐐癸紝鍒欐槸鍥?c)鐨勬儏鍐碉紝榪欐椂涓ょ嚎孌靛彧鏈変竴涓氦鐐癸紝鍚﹀垯灝辨槸鍥?b)鐨勬儏鍐碉紝涓ょ嚎孌典篃鏄湁鏃犵┓鐨勪氦鐐癸紱濡傛灉line1涓嶅寘鍚玪ine2鐨勪換浣曠鐐癸紝鍒欐槸鍥?a)鐨勬儏鍐碉紝榪欐椂涓ょ嚎孌墊病鏈変氦鐐廣?/p>

銆銆璁句竴鏉$嚎孌典負L0 = P1P2錛屽彟涓鏉$嚎孌墊垨鐩寸嚎涓篖1 = Q1Q2 錛岃璁$畻鐨勫氨鏄疞0鍜孡1鐨勪氦鐐廣?br>
銆銆1錛?棣栧厛鍒ゆ柇L0鍜孡1鏄惁鐩鎬氦錛堟柟娉曞凡鍦ㄥ墠鏂囪璁鴻繃錛夛紝濡傛灉涓嶇浉浜ゅ垯娌℃湁浜ょ偣錛屽惁鍒欒鏄嶭0鍜孡1涓瀹氭湁浜ょ偣錛屼笅闈㈠氨灝哃0鍜孡1閮界湅浣滅洿綰挎潵鑰冭檻銆?
銆銆2錛?濡傛灉P1鍜孭2妯潗鏍囩浉鍚岋紝鍗矻0騫寵浜嶻杞?
銆銆a) 鑻1涔熷鉤琛屼簬Y杞達紝
銆銆i. 鑻1鐨勭旱鍧愭爣鍜孮1鐨勭旱鍧愭爣鐩稿悓錛岃鏄嶭0鍜孡1鍏辯嚎錛屽亣濡侺1鏄洿綰跨殑璇濅粬浠湁鏃犵┓鐨勪氦鐐癸紝鍋囧L1鏄嚎孌電殑璇濆彲鐢?璁$畻涓ゆ潯鍏辯嚎綰挎鐨勪氦鐐?鐨勭畻娉曟眰浠栦滑鐨勪氦鐐癸紙璇ユ柟娉曞湪鍓嶆枃宸茶璁鴻繃錛夛紱
銆銆ii. 鍚﹀垯璇存槑L0鍜孡1騫寵錛屼粬浠病鏈変氦鐐癸紱
銆銆b) 鑻1涓嶅鉤琛屼簬Y杞達紝鍒欎氦鐐規(guī)í鍧愭爣涓篜1鐨勬í鍧愭爣錛屼唬鍏ュ埌L1鐨勭洿綰挎柟紼嬩腑鍙互璁$畻鍑轟氦鐐圭旱鍧愭爣錛?
銆銆3錛?濡傛灉P1鍜孭2妯潗鏍囦笉鍚岋紝浣嗘槸Q1鍜孮2妯潗鏍囩浉鍚岋紝鍗矻1騫寵浜嶻杞達紝鍒欎氦鐐規(guī)í鍧愭爣涓篞1鐨勬í鍧愭爣錛屼唬鍏ュ埌L0鐨勭洿綰挎柟紼嬩腑鍙互璁$畻鍑轟氦鐐圭旱鍧愭爣錛?
銆銆4錛?濡傛灉P1鍜孭2綰靛潗鏍囩浉鍚岋紝鍗矻0騫寵浜嶺杞?
銆銆a) 鑻1涔熷鉤琛屼簬X杞達紝
銆銆i. 鑻1鐨勬í鍧愭爣鍜孮1鐨勬í鍧愭爣鐩稿悓錛岃鏄嶭0鍜孡1鍏辯嚎錛屽亣濡侺1鏄洿綰跨殑璇濅粬浠湁鏃犵┓鐨勪氦鐐癸紝鍋囧L1鏄嚎孌電殑璇濆彲鐢?璁$畻涓ゆ潯鍏辯嚎綰挎鐨勪氦鐐?鐨勭畻娉曟眰浠栦滑鐨勪氦鐐癸紙璇ユ柟娉曞湪鍓嶆枃宸茶璁鴻繃錛夛紱
銆銆ii. 鍚﹀垯璇存槑L0鍜孡1騫寵錛屼粬浠病鏈変氦鐐癸紱
銆銆b) 鑻1涓嶅鉤琛屼簬X杞達紝鍒欎氦鐐圭旱鍧愭爣涓篜1鐨勭旱鍧愭爣錛屼唬鍏ュ埌L1鐨勭洿綰挎柟紼嬩腑鍙互璁$畻鍑轟氦鐐規(guī)í鍧愭爣錛?
銆銆5錛?濡傛灉P1鍜孭2綰靛潗鏍囦笉鍚岋紝浣嗘槸Q1鍜孮2綰靛潗鏍囩浉鍚岋紝鍗矻1騫寵浜嶺杞達紝鍒欎氦鐐圭旱鍧愭爣涓篞1鐨勭旱鍧愭爣錛屼唬鍏ュ埌L0鐨勭洿綰挎柟紼嬩腑鍙互璁$畻鍑轟氦鐐規(guī)í鍧愭爣錛?
銆銆6錛?鍓╀笅鐨勬儏鍐靛氨鏄疞1鍜孡0鐨勬枩鐜囧潎瀛樺湪涓斾笉涓?鐨勬儏鍐?
銆銆a) 璁$畻鍑篖0鐨勬枩鐜嘖0錛孡1鐨勬枩鐜嘖1 錛?
銆銆b) 濡傛灉K1 = K2
銆銆i. 濡傛灉Q1鍦↙0涓婏紝鍒欒鏄嶭0鍜孡1鍏辯嚎錛屽亣濡侺1鏄洿綰跨殑璇濇湁鏃犵┓浜ょ偣錛屽亣濡侺1鏄嚎孌電殑璇濆彲鐢?璁$畻涓ゆ潯鍏辯嚎綰挎鐨勪氦鐐?鐨勭畻娉曟眰浠栦滑鐨勪氦鐐癸紙璇ユ柟娉曞湪鍓嶆枃宸茶璁鴻繃錛夛紱
銆銆ii. 濡傛灉Q1涓嶅湪L0涓婏紝鍒欒鏄嶭0鍜孡1騫寵錛屼粬浠病鏈変氦鐐廣?br>
銆銆c) 鑱旂珛涓ょ洿綰跨殑鏂圭▼緇勫彲浠ヨВ鍑轟氦鐐規(guī)潵
銆銆榪欎釜綆楁硶騫朵笉澶嶆潅錛屼絾鏄鍒嗘儏鍐佃璁烘竻妤氾紝灝ゅ叾鏄綋涓ゆ潯綰挎鍏辯嚎鐨勬儏鍐甸渶瑕佸崟鐙冭檻錛屾墍浠ュ湪鍓嶆枃灝嗘眰涓ゆ潯鍏辯嚎綰挎鐨勭畻娉曞崟鐙啓鍑烘潵銆傚彟澶栵紝涓寮濮嬪氨鍏堝埄鐢ㄧ煝閲忓弶涔樺垽鏂嚎孌典笌綰挎錛堟垨鐩寸嚎錛夋槸鍚︾浉浜わ紝濡傛灉緇撴灉鏄浉浜わ紝閭d箞鍦ㄥ悗闈㈠氨鍙互灝嗙嚎孌靛叏閮ㄧ湅浣滅洿綰挎潵鑰冭檻銆傞渶瑕佹敞鎰忕殑鏄紝鎴戜滑鍙互灝嗙洿綰挎垨綰挎鏂圭▼鏀瑰啓涓篴x+by+c=0鐨勫艦寮忥紝榪欐牱涓鏉ヤ笂榪拌繃紼嬬殑閮ㄥ垎姝ラ鍙互鍚堝茍錛岀緝鐭簡浠g爜闀垮害錛屼絾鏄敱浜庡厛瑕佹眰鍑哄弬鏁幫紝榪欑綆楁硶灝嗚姳璐規(guī)洿澶氱殑鏃墮棿銆?
姹傜嚎孌墊垨鐩寸嚎涓庢姌綰褲佺煩褰€佸杈瑰艦鐨勪氦鐐癸細
鍒嗗埆姹備笌姣忔潯杈圭殑浜ょ偣鍗沖彲銆?
姹傜嚎孌墊垨鐩寸嚎涓庡渾鐨勪氦鐐?
銆銆璁懼渾蹇冧負O錛屽渾鍗婂緞涓簉錛岀洿綰匡紙鎴栫嚎孌碉級L涓婄殑涓ょ偣涓篜1,P2銆?
銆銆1. 濡傛灉L鏄嚎孌典笖P1錛孭2閮藉寘鍚湪鍦哋鍐咃紝鍒欐病鏈変氦鐐癸紱鍚﹀垯榪涜涓嬩竴姝ャ?
銆銆2. 濡傛灉L騫寵浜嶻杞達紝
銆銆a) 璁$畻鍦嗗績鍒癓鐨勮窛紱籨is錛?br>銆銆b) 濡傛灉dis > r 鍒橪鍜屽渾娌℃湁浜ょ偣錛?br>銆銆c) 鍒╃敤鍕捐偂瀹氱悊錛屽彲浠ユ眰鍑轟袱浜ょ偣鍧愭爣錛屼絾瑕佹敞鎰忚冭檻L鍜屽渾鐨勭浉鍒囨儏鍐點?br>
銆銆3. 濡傛灉L騫寵浜嶺杞達紝鍋氭硶涓嶭騫寵浜嶻杞寸殑鎯呭喌綾諱技錛?
銆銆4. 濡傛灉L鏃笉騫寵X杞翠篃涓嶅鉤琛孻杞達紝鍙互姹傚嚭L鐨勬枩鐜嘖錛岀劧鍚庡垪鍑篖鐨勭偣鏂滃紡鏂圭▼錛屽拰鍦嗘柟紼嬭仈绔嬪嵆鍙眰瑙e嚭L鍜屽渾鐨勪袱涓氦鐐癸紱
銆銆5. 濡傛灉L鏄嚎孌碉紝瀵逛簬2錛?錛?涓眰鍑虹殑浜ょ偣榪樿鍒嗗埆鍒ゆ柇鏄惁灞炰簬璇ョ嚎孌電殑鑼冨洿鍐呫?
鍑稿寘鐨勬蹇碉細
銆銆鐐歸泦Q鐨勫嚫鍖?convex hull)鏄寚涓涓渶灝忓嚫澶氳竟褰紝婊¤凍Q涓殑鐐規(guī)垨鑰呭湪澶氳竟褰㈣竟涓婃垨鑰呭湪鍏跺唴銆備笅鍥句腑鐢辯孩鑹茬嚎孌佃〃紺虹殑澶氳竟褰㈠氨鏄偣闆哘={p0,p1,...p12}鐨勫嚫鍖呫?/p>

銆銆鐜板湪宸茬粡璇佹槑浜嗗嚫鍖呯畻娉曠殑鏃墮棿澶嶆潅搴︿笅鐣屾槸O(n*logn),浣嗘槸褰撳嚫鍖呯殑欏剁偣鏁癶涔熻鑰冭檻榪涘幓鐨勮瘽錛孠rikpatrick鍜孲eidel鐨勫壀鏋濇悳绱㈢畻娉曞彲浠ヨ揪鍒癘(n*logh)錛屽湪娓愯繘鎰忎箟涓嬭揪鍒版渶浼樸傛渶甯哥敤鐨勫嚫鍖呯畻娉曟槸Graham鎵弿娉曞拰Jarvis姝ヨ繘娉曘傛湰鏂囧彧綆鍗曚粙緇嶄竴涓婫raham鎵弿娉曪紝鍏舵紜х殑璇佹槑鍜孞arvis姝ヨ繘娉曠殑榪囩▼澶у鍙互鍙傝冦婄畻娉曞璁恒嬨?
銆銆瀵逛簬涓涓湁涓変釜鎴栦互涓婄偣鐨勭偣闆哘錛孏raham鎵弿娉曠殑榪囩▼濡備笅錛?
銆銆浠0涓篞涓璝-X鍧愭爣鎺掑簭涓嬫渶灝忕殑鐐?
銆銆璁?lt;p1,p2,...pm>涓哄鍏朵綑鐐規(guī)寜浠0涓轟腑蹇冪殑鏋佽閫嗘椂閽堟帓搴忔墍寰楃殑鐐歸泦錛堝鏋滄湁澶氫釜鐐規(guī)湁鐩稿悓鐨勬瀬瑙掞紝闄や簡璺漰0鏈榪滅殑鐐瑰鍏ㄩ儴縐婚櫎
銆銆鍘媝0榪涙爤S
銆銆鍘媝1榪涙爤S
銆銆鍘媝2榪涙爤S
銆銆for i ← 3 to m
銆銆do while 鐢盨鐨勬爤欏跺厓绱犵殑涓嬩竴涓厓绱犮丼鐨勬爤欏跺厓绱犱互鍙妏i鏋勬垚鐨勬姌綰挎涓嶆嫄鍚戝乏渚?br>銆銆瀵筍寮規(guī)爤
銆銆鍘媝i榪涙爤S
銆銆return S;
銆銆姝よ繃紼嬫墽琛屽悗錛屾爤S鐢卞簳鑷抽《鐨勫厓绱犲氨鏄疩鐨勫嚫鍖呴《鐐規(guī)寜閫嗘椂閽堟帓鍒楃殑鐐瑰簭鍒椼傞渶瑕佹敞鎰忕殑鏄紝鎴戜滑瀵圭偣鎸夋瀬瑙掗嗘椂閽堟帓搴忔椂錛屽茍涓嶉渶瑕佺湡姝f眰鍑烘瀬瑙掞紝鍙渶瑕佹眰鍑轟換鎰忎袱鐐圭殑嬈″簭灝卞彲浠ヤ簡銆傝岃繖涓楠ゅ彲浠ョ敤鍓嶈堪鐨勭煝閲忓弶縐ц川瀹炵幇銆?
鍥涖佺粨璇?/strong>
銆銆灝界浜虹被瀵瑰嚑浣曞鐨勭爺絀朵粠鍙や唬璧蜂究娌℃湁涓柇榪囷紝浣嗘槸鍏蜂綋鍒板熷姪璁$畻鏈烘潵瑙e喅鍑犱綍闂鐨勭爺絀訛紝榪樺彧鏄仠鐣欏湪涓涓垵綰ч樁孌碉紝鏃犺浠庡簲鐢ㄩ鍩熻繕鏄彂灞曞墠鏅潵鐪嬶紝璁$畻鍑犱綍瀛﹂兘鍊煎緱鎴戜滑璁ょ湡瀛︿範銆佸姞浠ヨ繍鐢紝甯屾湜榪欑瘒鏂囩珷鑳藉甫浣犺蛋榪涜繖涓赴瀵屽褰╃殑涓栫晫銆?/p>

鍒ゆ柇鐐規(guī)槸鍚﹀湪綰挎涓婏細
銆銆璁劇偣涓篞錛岀嚎孌典負P1P2 錛屽垽鏂偣Q鍦ㄨ綰挎涓婄殑渚濇嵁鏄細( Q - P1 ) × ( P2 - P1 ) = 0 涓?Q 鍦ㄤ互 P1錛孭2涓哄瑙掗《鐐圭殑鐭╁艦鍐呫傚墠鑰呬繚璇丵鐐瑰湪鐩寸嚎P1P2涓婏紝鍚庤呮槸淇濊瘉Q鐐逛笉鍦ㄧ嚎孌礟1P2鐨勫歡闀跨嚎鎴栧弽鍚戝歡闀跨嚎涓婏紝瀵逛簬榪欎竴姝ラ鐨勫垽鏂彲浠ョ敤浠ヤ笅榪囩▼瀹炵幇錛?br>
銆銆ON-SEGMENT(pi,pj,pk)
銆銆if min(xi,xj)<=xk<=max(xi,xj) and min(yi,yj)<=yk<=max(yi,yj)
銆銆then return true;
銆銆else return false;
銆銆鐗瑰埆瑕佹敞鎰忕殑鏄紝鐢變簬闇瑕佽冭檻姘村鉤綰挎鍜屽瀭鐩寸嚎孌典袱縐嶇壒孌婃儏鍐碉紝min(xi,xj)<=xk<=max(xi,xj)鍜宮in(yi,yj)<=yk<=max(yi,yj)涓や釜鏉′歡蹇呴』鍚屾椂婊¤凍鎵嶈兘榪斿洖鐪熷箋?br>
鍒ゆ柇涓ょ嚎孌墊槸鍚︾浉浜わ細
鎴戜滑鍒嗕袱姝ョ‘瀹氫袱鏉$嚎孌墊槸鍚︾浉浜わ細
銆銆(1)蹇熸帓鏂ヨ瘯楠?br>
銆銆璁句互綰挎 P1P2 涓哄瑙掔嚎鐨勭煩褰負R錛?璁句互綰挎 Q1Q2 涓哄瑙掔嚎鐨勭煩褰負T錛屽鏋淩鍜孴涓嶇浉浜わ紝鏄劇劧涓ょ嚎孌典笉浼氱浉浜ゃ?br>
銆銆(2)璺ㄧ珛璇曢獙
銆銆濡傛灉涓ょ嚎孌電浉浜わ紝鍒欎袱綰挎蹇呯劧鐩鎬簰璺ㄧ珛瀵規(guī)柟銆傝嫢P1P2璺ㄧ珛Q1Q2 錛屽垯鐭㈤噺 ( P1 - Q1 ) 鍜? P2 - Q1 )浣嶄簬鐭㈤噺( Q2 - Q1 ) 鐨勪袱渚э紝鍗? P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0銆備笂寮忓彲鏀瑰啓鎴? P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0銆傚綋 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 鏃訛紝璇存槑 ( P1 - Q1 ) 鍜?( Q2 - Q1 )鍏辯嚎錛屼絾鏄洜涓哄凡緇忛氳繃蹇熸帓鏂ヨ瘯楠岋紝鎵浠?P1 涓瀹氬湪綰挎 Q1Q2涓婏紱鍚岀悊錛? Q2 - Q1 ) ×(P2 - Q1 ) = 0 璇存槑 P2 涓瀹氬湪綰挎 Q1Q2涓娿傛墍浠ュ垽鏂璓1P2璺ㄧ珛Q1Q2鐨勪緷鎹槸錛? P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0銆傚悓鐞嗗垽鏂璔1Q2璺ㄧ珛P1P2鐨勪緷鎹槸錛? Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0銆傚叿浣撴儏鍐靛涓嬪浘鎵紺猴細

鍦ㄧ浉鍚岀殑鍘熺悊涓嬶紝瀵規(guī)綆楁硶鐨勫叿浣撶殑瀹炵幇緇嗚妭鍙兘浼氫笌姝ゆ湁鎵涓嶅悓錛岄櫎浜嗚繖縐嶈繃紼嬪錛屽ぇ瀹朵篃鍙互鍙傝冦婄畻娉曞璁恒嬩笂鐨勫疄鐜般?br> 涓轟簡緇熶竴璧瘋錛屾垜浠湪璁$畻灝勭嚎L鍜屽杈瑰艦鐨勪氦鐐圭殑鏃跺欙紝1銆傚浜庡杈瑰艦鐨勬按騫寵竟涓嶄綔鑰冭檻錛?銆傚浜庡杈瑰艦鐨勯《鐐瑰拰L鐩鎬氦鐨勬儏鍐碉紝濡傛灉璇ラ《鐐規(guī)槸鍏舵墍灞炵殑杈逛笂綰靛潗鏍囪緝澶х殑欏剁偣錛屽垯璁℃暟錛屽惁鍒欏拷鐣ワ紱3銆傚浜嶱鍦ㄥ杈瑰艦杈逛笂鐨勬儏褰紝鐩存帴鍙垽鏂璓灞炰簬澶氳竟琛屻傜敱姝ゅ緱鍑虹畻娉曠殑浼唬鐮佸涓嬶細 鍥犳鎴戜滑鍙互鍏堟眰鍑烘墍鏈夊拰綰挎鐩鎬氦鐨勫杈瑰艦鐨勯《鐐癸紝鐒跺悗鎸夌収X-Y鍧愭爣鎺掑簭(X鍧愭爣灝忕殑鎺掑湪鍓嶉潰錛屽浜嶺鍧愭爣鐩稿悓鐨勭偣錛孻鍧愭爣灝忕殑鎺掑湪鍓嶉潰錛岃繖縐嶆帓搴忓噯鍒欎篃鏄負浜嗕繚璇佹按騫沖拰鍨傜洿鎯呭喌鐨勫垽鏂紜?錛岃繖鏍風浉閭?cè)潥勪袱涓偣灏辨槸鍦ňU挎涓婄浉閭?cè)潥勪袱浜ょ偣锛屽鏋滀焕L剰鐩擱偦涓ょ偣鐨勪腑鐐逛篃鍦ㄥ杈瑰艦鍐咃紝鍒欒綰挎涓瀹氬湪澶氳竟褰㈠唴銆? 璁$畻綰挎鎴栫洿綰夸笌綰挎鐨勪氦鐐? 鍑稿寘鐨勬眰娉曪細
鍒ゆ柇綰挎鍜岀洿綰挎槸鍚︾浉浜わ細
鏈変簡涓婇潰鐨勫熀紜錛岃繖涓畻娉曞氨寰堝鏄撲簡銆傚鏋滅嚎孌礟1P2鍜岀洿綰縌1Q2鐩鎬氦錛屽垯P1P2璺ㄧ珛Q1Q2錛屽嵆錛? P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0銆?br>
鍒ゆ柇鐭╁艦鏄惁鍖呭惈鐐癸細
鍙鍒ゆ柇璇ョ偣鐨勬í鍧愭爣鍜岀旱鍧愭爣鏄惁澶瑰湪鐭╁艦鐨勫乏鍙寵竟鍜屼笂涓嬭竟涔嬮棿銆?br>
鍒ゆ柇綰挎銆佹姌綰褲佸杈瑰艦鏄惁鍦ㄧ煩褰腑錛?/strong>
鍥犱負鐭╁艦鏄釜鍑擱泦錛屾墍浠ュ彧瑕佸垽鏂墍鏈夌鐐規(guī)槸鍚﹂兘鍦ㄧ煩褰腑灝卞彲浠ヤ簡銆?br>
鍒ゆ柇鐭╁艦鏄惁鍦ㄧ煩褰腑錛?/strong>
鍙姣旇緝宸﹀彸杈圭晫鍜屼笂涓嬭竟鐣屽氨鍙互浜嗐?br>
鍒ゆ柇鍦嗘槸鍚﹀湪鐭╁艦涓細
寰堝鏄撹瘉鏄庯紝鍦嗗湪鐭╁艦涓殑鍏呰鏉′歡鏄細鍦嗗績鍦ㄧ煩褰腑涓斿渾鐨勫崐寰勫皬浜庣瓑浜庡渾蹇冨埌鐭╁艦鍥涜竟鐨勮窛紱葷殑鏈灝忓箋?br>
鍒ゆ柇鐐規(guī)槸鍚﹀湪澶氳竟褰腑錛?/strong>
銆銆鍒ゆ柇鐐筆鏄惁鍦ㄥ杈瑰艦涓槸璁$畻鍑犱綍涓竴涓潪甯稿熀鏈絾鏄崄鍒嗛噸瑕佺殑綆楁硶銆備互鐐筆涓虹鐐癸紝鍚戝乏鏂逛綔灝勭嚎L錛岀敱浜庡杈瑰艦鏄湁鐣岀殑錛屾墍浠ュ皠綰縇鐨勫乏绔竴瀹氬湪澶氳竟褰㈠錛岃冭檻娌跨潃L浠庢棤絀瘋繙澶勫紑濮嬭嚜宸﹀悜鍙崇Щ鍔紝閬囧埌鍜屽杈瑰艦鐨勭涓涓氦鐐圭殑鏃跺欙紝榪涘叆鍒頒簡澶氳竟褰㈢殑鍐呴儴錛岄亣鍒扮浜屼釜浜ょ偣鐨勬椂鍊欙紝紱誨紑浜嗗杈瑰艦錛?#8230;…鎵浠ュ緢瀹規(guī)槗鐪嬪嚭褰揕鍜屽杈瑰艦鐨勪氦鐐規(guī)暟鐩瓹鏄鏁扮殑鏃跺欙紝P鍦ㄥ杈瑰艦鍐咃紝鏄伓鏁扮殑璇漃鍦ㄥ杈瑰艦澶栥?br>
銆銆浣嗘槸鏈変簺鐗規(guī)畩鎯呭喌瑕佸姞浠ヨ冭檻銆傚鍥句笅鍥?a)(b)(c)(d)鎵紺恒傚湪鍥?a)涓紝L鍜屽杈瑰艦鐨勯《鐐圭浉浜わ紝榪欐椂鍊欎氦鐐瑰彧鑳借綆椾竴涓紱鍦ㄥ浘(b)涓紝L鍜屽杈瑰艦欏剁偣鐨勪氦鐐逛笉搴旇璁$畻錛涘湪鍥?c)鍜?d) 涓紝L鍜屽杈瑰艦鐨勪竴鏉¤竟閲嶅悎錛岃繖鏉¤竟搴旇琚拷鐣ヤ笉璁°傚鏋淟鍜屽杈瑰艦鐨勪竴鏉¤竟閲嶅悎錛岃繖鏉¤竟搴旇琚拷鐣ヤ笉璁°?/p>

銆銆count ← 0;
銆銆浠涓虹鐐癸紝浣滀粠鍙沖悜宸︾殑灝勭嚎L;
銆銆for 澶氳竟褰㈢殑姣忔潯杈箂
銆銆do if P鍦ㄨ竟s涓?
銆銆then return true;
銆銆if s涓嶆槸姘村鉤鐨?br>銆銆then if s鐨勪竴涓鐐瑰湪L涓?br>銆銆if 璇ョ鐐規(guī)槸s涓ょ鐐逛腑綰靛潗鏍囪緝澶х殑绔偣
銆銆then count ← count+1
銆銆else if s鍜孡鐩鎬氦
銆銆then count ← count+1;
銆銆if count mod 2 = 1
銆銆then return true;
銆銆else return false;
銆銆鍏朵腑鍋氬皠綰縇鐨勬柟娉曟槸錛氳P'鐨勭旱鍧愭爣鍜孭鐩稿悓錛屾í鍧愭爣涓烘鏃犵┓澶э紙寰堝ぇ鐨勪竴涓鏁幫級錛屽垯P鍜孭'灝辯‘瀹氫簡灝勭嚎L銆?
銆銆鍒ゆ柇鐐規(guī)槸鍚﹀湪澶氳竟褰腑鐨勮繖涓畻娉曠殑鏃墮棿澶嶆潅搴︿負O(n)銆?br>
銆銆鍙﹀榪樻湁涓縐嶇畻娉曟槸鐢ㄥ甫絎﹀彿鐨勪笁瑙掑艦闈㈢Н涔嬪拰涓庡杈瑰艦闈㈢Н榪涜姣旇緝錛岃繖縐嶇畻娉曠敱浜庝嬌鐢ㄦ誕鐐規(guī)暟榪愮畻鎵浠ヤ細甯︽潵涓瀹氳宸紝涓嶆帹鑽愬ぇ瀹朵嬌鐢ㄣ?
鍒ゆ柇綰挎鏄惁鍦ㄥ杈瑰艦鍐咃細
銆銆綰挎鍦ㄥ杈瑰艦鍐呯殑涓涓繀瑕佹潯浠舵槸綰挎鐨勪袱涓鐐歸兘鍦ㄥ杈瑰艦鍐咃紝浣嗙敱浜庡杈瑰艦鍙兘涓哄嚬錛屾墍浠ヨ繖涓嶈兘鎴愪負鍒ゆ柇鐨勫厖鍒嗘潯浠躲傚鏋滅嚎孌靛拰澶氳竟褰㈢殑鏌愭潯杈瑰唴浜わ紙涓ょ嚎孌靛唴浜ゆ槸鎸囦袱綰挎鐩鎬氦涓斾氦鐐逛笉鍦ㄤ袱綰挎鐨勭鐐癸級錛屽洜涓哄杈瑰艦鐨勮竟鐨勫乏鍙充袱渚у垎灞炲杈瑰艦鍐呭涓嶅悓閮ㄥ垎錛屾墍浠ョ嚎孌典竴瀹氫細鏈変竴閮ㄥ垎鍦ㄥ杈瑰艦澶?瑙佸浘a)銆備簬鏄垜浠緱鍒扮嚎孌靛湪澶氳竟褰㈠唴鐨勭浜屼釜蹇呰鏉′歡錛氱嚎孌靛拰澶氳竟褰㈢殑鎵鏈夎竟閮戒笉鍐呬氦銆?
銆銆綰挎鍜屽杈瑰艦浜や簬綰挎鐨勪袱绔偣騫朵笉浼氬獎鍝嶇嚎孌墊槸鍚﹀湪澶氳竟褰㈠唴錛涗絾鏄鏋滃杈瑰艦鐨勬煇涓《鐐瑰拰綰挎鐩鎬氦錛岃繕蹇呴』鍒ゆ柇涓ょ浉閭諱氦鐐逛箣闂寸殑綰挎鏄惁鍖呭惈浜庡杈瑰艦鍐呴儴錛堝弽渚嬭鍥綽)銆?/p>

銆銆璇佹槑濡備笅錛?br>
銆銆鍛介1錛?br>
銆銆濡傛灉綰挎鍜屽杈瑰艦鐨勪袱鐩擱偦浜ょ偣P1 錛孭2鐨勪腑鐐筆' 涔熷湪澶氳竟褰㈠唴錛屽垯P1, P2涔嬮棿鐨勬墍鏈夌偣閮藉湪澶氳竟褰㈠唴銆?br>
銆銆璇佹槑錛?br>
銆銆鍋囪P1,P2涔嬮棿鍚湁涓嶅湪澶氳竟褰㈠唴鐨勭偣錛屼笉濡ㄨ璇ョ偣涓篞錛屽湪P1, P'涔嬮棿錛屽洜涓哄杈瑰艦鏄棴鍚堟洸綰匡紝鎵浠ュ叾鍐呭閮ㄤ箣闂存湁鐣岋紝鑰孭1灞炰簬澶氳竟琛屽唴閮紝Q灞炰簬澶氳竟鎬у閮紝P'灞炰簬澶氳竟鎬у唴閮紝P1-Q-P'瀹屽叏榪炵畫錛屾墍浠1Q鍜孮P'涓瀹氳法瓚婂杈瑰艦鐨勮竟鐣岋紝鍥犳鍦≒1,P'涔嬮棿鑷沖皯榪樻湁涓や釜璇ョ嚎孌靛拰澶氳竟褰㈢殑浜ょ偣錛岃繖鍜孭1P2鏄浉閭諱袱浜ょ偣鐭涚浘錛屾晠鍛介鎴愮珛銆傝瘉姣曘?
銆銆鐢卞懡棰?鐩存帴鍙緱鍑烘帹璁猴細
銆銆鎺ㄨ2錛?br>
銆銆璁懼杈瑰艦鍜岀嚎孌礟Q鐨勪氦鐐逛緷嬈′負P1,P2,……Pn錛屽叾涓璓i鍜孭i+1鏄浉閭諱袱浜ょ偣錛岀嚎孌礟Q鍦ㄥ杈瑰艦鍐呯殑鍏呰鏉′歡鏄細P錛孮鍦ㄥ杈瑰艦鍐呬笖瀵逛簬i =1, 2,……, n-1錛孭i ,Pi+1鐨勪腑鐐逛篃鍦ㄥ杈瑰艦鍐呫?br>
銆銆鍦ㄥ疄闄呯紪紼嬩腑錛屾病鏈夊繀瑕佽綆楁墍鏈夌殑浜ょ偣錛岄鍏堝簲鍒ゆ柇綰挎鍜屽杈瑰艦鐨勮竟鏄惁鍐呬氦錛屽樿嫢綰挎鍜屽杈瑰艦鐨勬煇鏉¤竟鍐呬氦鍒欑嚎孌典竴瀹氬湪澶氳竟褰㈠錛涘鏋滅嚎孌靛拰澶氳竟褰㈢殑姣忎竴鏉¤竟閮戒笉鍐呬氦錛屽垯綰挎鍜屽杈瑰艦鐨勪氦鐐逛竴瀹氭槸綰挎鐨勭鐐規(guī)垨鑰呭杈瑰艦鐨勯《鐐癸紝鍙鍒ゆ柇鐐規(guī)槸鍚﹀湪綰挎涓婂氨鍙互浜嗐?br>
銆銆鑷蟲鎴戜滑寰楀嚭綆楁硶濡備笅錛?br>
銆銆if 綰跨PQ鐨勭鐐逛笉閮藉湪澶氳竟褰㈠唴
銆銆then return false;
銆銆鐐歸泦pointSet鍒濆鍖栦負絀?
銆銆for 澶氳竟褰㈢殑姣忔潯杈箂
銆銆do if 綰挎鐨勬煇涓鐐瑰湪s涓?br>銆銆then 灝嗚绔偣鍔犲叆pointSet;
銆銆else if s鐨勬煇涓鐐瑰湪綰挎PQ涓?br>銆銆then 灝嗚绔偣鍔犲叆pointSet;
銆銆else if s鍜岀嚎孌礟Q鐩鎬氦 // 榪欐椂鍊欏凡緇忓彲浠ヨ偗瀹氭槸鍐呬氦浜?br>銆銆then return false;
銆銆灝唒ointSet涓殑鐐規(guī)寜鐓-Y鍧愭爣鎺掑簭;
銆銆for pointSet涓瘡涓や釜鐩擱偦鐐?pointSet[i] , pointSet[ i+1]
銆銆do if pointSet[i] , pointSet[ i+1] 鐨勪腑鐐逛笉鍦ㄥ杈瑰艦涓?br>銆銆then return false;
銆銆return true;
銆銆榪欎釜榪囩▼涓殑鎺掑簭鍥犱負浜ょ偣鏁扮洰鑲畾榪滃皬浜庡杈瑰艦鐨勯《鐐規(guī)暟鐩畁錛屾墍浠ユ渶澶氭槸甯告暟綰х殑澶嶆潅搴︼紝鍑犱箮鍙互蹇界暐涓嶈銆傚洜姝ょ畻娉曠殑鏃墮棿澶嶆潅搴︿篃鏄疧(n)銆?
鍒ゆ柇鎶樼嚎鏄惁鍦ㄥ杈瑰艦鍐咃細
銆銆鍙鍒ゆ柇鎶樼嚎鐨勬瘡鏉$嚎孌墊槸鍚﹂兘鍦ㄥ杈瑰艦鍐呭嵆鍙傝鎶樼嚎鏈塵鏉$嚎孌碉紝澶氳竟褰㈡湁n涓《鐐癸紝鍒欒綆楁硶鐨勬椂闂村鏉傚害涓篛(m*n)銆?
銆鍒ゆ柇澶氳竟褰㈡槸鍚﹀湪澶氳竟褰㈠唴錛?
銆銆鍙鍒ゆ柇澶氳竟褰㈢殑姣忔潯杈規(guī)槸鍚﹂兘鍦ㄥ杈瑰艦鍐呭嵆鍙傚垽鏂竴涓湁m涓《鐐圭殑澶氳竟褰㈡槸鍚﹀湪涓涓湁n涓《鐐圭殑澶氳竟褰㈠唴澶嶆潅搴︿負O(m*n)銆?br>
銆銆鍒ゆ柇鐭╁艦鏄惁鍦ㄥ杈瑰艦鍐咃細
灝嗙煩褰㈣漿鍖栦負澶氳竟褰紝鐒跺悗鍐嶅垽鏂槸鍚﹀湪澶氳竟褰㈠唴銆?
鍒ゆ柇鍦嗘槸鍚﹀湪澶氳竟褰㈠唴錛?/strong>
銆銆鍙璁$畻鍦嗗績鍒板杈瑰艦鐨勬瘡鏉¤竟鐨勬渶鐭窛紱伙紝濡傛灉璇ヨ窛紱誨ぇ浜庣瓑浜庡渾鍗婂緞鍒欒鍦嗗湪澶氳竟褰㈠唴銆傝綆楀渾蹇冨埌澶氳竟褰㈡瘡鏉¤竟鏈鐭窛紱葷殑綆楁硶鍦ㄥ悗鏂囬槓榪般?
鍒ゆ柇鐐規(guī)槸鍚﹀湪鍦嗗唴錛?/strong>
璁$畻鍦嗗績鍒拌鐐圭殑璺濈錛屽鏋滃皬浜庣瓑浜庡崐寰勫垯璇ョ偣鍦ㄥ渾鍐呫?br>
鍒ゆ柇綰挎銆佹姌綰褲佺煩褰€佸杈瑰艦鏄惁鍦ㄥ渾鍐?
鍥犱負鍦嗘槸鍑擱泦錛屾墍浠ュ彧瑕佸垽鏂槸鍚︽瘡涓《鐐歸兘鍦ㄥ渾鍐呭嵆鍙?
鍒ゆ柇鍦嗘槸鍚﹀湪鍦嗗唴錛?/strong>
銆璁句袱鍦嗕負O1,O2錛屽崐寰勫垎鍒負r1, r2錛岃鍒ゆ柇O2鏄惁鍦∣1鍐呫傚厛姣旇緝r1錛宺2鐨勫ぇ灝忥紝濡傛灉r1<r2鍒橭2涓嶅彲鑳藉湪O1鍐咃紱鍚﹀垯濡傛灉涓ゅ渾蹇冪殑璺濈澶т簬r1 - r2 錛屽垯O2涓嶅湪O1鍐咃紱鍚﹀垯O2鍦∣1鍐呫?
璁$畻鐐瑰埌綰挎鐨勬渶榪戠偣錛?/strong>
銆銆濡傛灉璇ョ嚎孌靛鉤琛屼簬X杞達紙Y杞達級錛屽垯榪囩偣point浣滆綰挎鎵鍦ㄧ洿綰跨殑鍨傜嚎錛屽瀭瓚沖緢瀹規(guī)槗姹傚緱錛岀劧鍚庤綆楀嚭鍨傝凍錛屽鏋滃瀭瓚沖湪綰挎涓婂垯榪斿洖鍨傝凍錛屽惁鍒欒繑鍥炵鍨傝凍榪戠殑绔偣錛涘鏋滆綰挎涓嶅鉤琛屼簬X杞翠篃涓嶅鉤琛屼簬Y杞達紝鍒欐枩鐜囧瓨鍦ㄤ笖涓嶄負0銆傝綰挎鐨勪袱绔偣涓簆t1鍜宲t2錛屾枩鐜囦負錛歬 = ( pt2.y - pt1. y ) / (pt2.x - pt1.x );璇ョ洿綰挎柟紼嬩負錛歽 = k* ( x - pt1.x) + pt1.y銆傚叾鍨傜嚎鐨勬枩鐜囦負 - 1 / k錛屽瀭綰挎柟紼嬩負錛歽 = (-1/k) * (x - point.x) + point.y 銆?
銆銆鑱旂珛涓ょ洿綰挎柟紼嬭В寰楋細x = ( k^2 * pt1.x + k * (point.y - pt1.y ) + point.x ) / ( k^2 + 1) 錛寉 = k * ( x - pt1.x) + pt1.y;鐒跺悗鍐嶅垽鏂瀭瓚蟲槸鍚﹀湪綰挎涓婏紝濡傛灉鍦ㄧ嚎孌典笂鍒欒繑鍥炲瀭瓚籌紱濡傛灉涓嶅湪鍒欒綆椾袱绔偣鍒板瀭瓚崇殑璺濈錛岄夋嫨璺濈鍨傝凍杈冭繎鐨勭鐐硅繑鍥炪?
璁$畻鐐瑰埌鎶樼嚎銆佺煩褰€佸杈瑰艦鐨勬渶榪戠偣錛?/strong>
鍙鍒嗗埆璁$畻鐐瑰埌姣忔潯綰挎鐨勬渶榪戠偣錛岃褰曟渶榪戣窛紱伙紝鍙栧叾涓渶榪戣窛紱繪渶灝忕殑鐐瑰嵆鍙?
璁$畻鐐瑰埌鍦嗙殑鏈榪戣窛紱誨強浜ょ偣鍧愭爣錛?/strong>
銆銆濡傛灉璇ョ偣鍦ㄥ渾蹇冿紝鍥犱負鍦嗗績鍒板渾鍛ㄤ換涓鐐圭殑璺濈鐩哥瓑錛岃繑鍥濽NDEFINED銆?
銆銆榪炴帴鐐筆鍜屽渾蹇僌錛屽鏋淧O騫寵浜嶺杞達紝鍒欐牴鎹甈鍦∣鐨勫乏杈硅繕鏄彸杈硅綆楀嚭鏈榪戠偣鐨勬í鍧愭爣涓篶enterPoint.x - radius 鎴?centerPoint.x + radius銆傚鏋淧O騫寵浜嶻杞達紝鍒欐牴鎹甈鍦∣鐨勪笂杈硅繕鏄笅杈硅綆楀嚭鏈榪戠偣鐨勭旱鍧愭爣涓?centerPoint.y -+radius鎴?centerPoint.y - radius銆傚鏋淧O涓嶅鉤琛屼簬X杞村拰Y杞達紝鍒橮O鐨勬枩鐜囧瓨鍦ㄤ笖涓嶄負0錛岃繖鏃剁洿綰縋O鏂滅巼涓簁 = 錛?P.y - O.y 錛? ( P.x - O.x )銆傜洿綰縋O鐨勬柟紼嬩負錛歽 = k * ( x - P.x) + P.y銆傝鍦嗘柟紼嬩負:(x - O.x ) ^2 + ( y - O.y ) ^2 = r ^2錛岃仈绔嬩袱鏂圭▼緇勫彲浠ヨВ鍑虹洿綰縋O鍜屽渾鐨勪氦鐐癸紝鍙栧叾涓P鐐硅緝榪戠殑浜ょ偣鍗沖彲銆?
璁$畻涓ゆ潯鍏辯嚎鐨勭嚎孌電殑浜ょ偣錛?/strong>
銆銆瀵逛簬涓ゆ潯鍏辯嚎鐨勭嚎孌碉紝瀹冧滑涔嬮棿鐨勪綅緗叧緋繪湁涓嬪浘鎵紺虹殑鍑犵鎯呭喌銆傚浘(a)涓袱鏉$嚎孌墊病鏈変氦鐐癸紱鍥?(b) 鍜?(d) 涓袱鏉$嚎孌墊湁鏃犵┓鐒︾偣錛涘浘 (c) 涓袱鏉$嚎孌墊湁涓涓氦鐐廣傝line1鏄袱鏉$嚎孌典腑杈冮暱鐨勪竴鏉★紝line2鏄緝鐭殑涓鏉★紝濡傛灉line1鍖呭惈浜唋ine2鐨勪袱涓鐐癸紝鍒欐槸鍥?d)鐨勬儏鍐碉紝涓ょ嚎孌墊湁鏃犵┓浜ょ偣錛涘鏋渓ine1鍙寘鍚玪ine2鐨勪竴涓鐐癸紝閭d箞濡傛灉line1鐨勬煇涓鐐圭瓑浜庤line1鍖呭惈鐨刲ine2鐨勯偅涓鐐癸紝鍒欐槸鍥?c)鐨勬儏鍐碉紝榪欐椂涓ょ嚎孌靛彧鏈変竴涓氦鐐癸紝鍚﹀垯灝辨槸鍥?b)鐨勬儏鍐碉紝涓ょ嚎孌典篃鏄湁鏃犵┓鐨勪氦鐐癸紱濡傛灉line1涓嶅寘鍚玪ine2鐨勪換浣曠鐐癸紝鍒欐槸鍥?a)鐨勬儏鍐碉紝榪欐椂涓ょ嚎孌墊病鏈変氦鐐廣?/p>

銆銆璁句竴鏉$嚎孌典負L0 = P1P2錛屽彟涓鏉$嚎孌墊垨鐩寸嚎涓篖1 = Q1Q2 錛岃璁$畻鐨勫氨鏄疞0鍜孡1鐨勪氦鐐廣?br>
銆銆1錛?棣栧厛鍒ゆ柇L0鍜孡1鏄惁鐩鎬氦錛堟柟娉曞凡鍦ㄥ墠鏂囪璁鴻繃錛夛紝濡傛灉涓嶇浉浜ゅ垯娌℃湁浜ょ偣錛屽惁鍒欒鏄嶭0鍜孡1涓瀹氭湁浜ょ偣錛屼笅闈㈠氨灝哃0鍜孡1閮界湅浣滅洿綰挎潵鑰冭檻銆?
銆銆2錛?濡傛灉P1鍜孭2妯潗鏍囩浉鍚岋紝鍗矻0騫寵浜嶻杞?
銆銆a) 鑻1涔熷鉤琛屼簬Y杞達紝
銆銆i. 鑻1鐨勭旱鍧愭爣鍜孮1鐨勭旱鍧愭爣鐩稿悓錛岃鏄嶭0鍜孡1鍏辯嚎錛屽亣濡侺1鏄洿綰跨殑璇濅粬浠湁鏃犵┓鐨勪氦鐐癸紝鍋囧L1鏄嚎孌電殑璇濆彲鐢?璁$畻涓ゆ潯鍏辯嚎綰挎鐨勪氦鐐?鐨勭畻娉曟眰浠栦滑鐨勪氦鐐癸紙璇ユ柟娉曞湪鍓嶆枃宸茶璁鴻繃錛夛紱
銆銆ii. 鍚﹀垯璇存槑L0鍜孡1騫寵錛屼粬浠病鏈変氦鐐癸紱
銆銆b) 鑻1涓嶅鉤琛屼簬Y杞達紝鍒欎氦鐐規(guī)í鍧愭爣涓篜1鐨勬í鍧愭爣錛屼唬鍏ュ埌L1鐨勭洿綰挎柟紼嬩腑鍙互璁$畻鍑轟氦鐐圭旱鍧愭爣錛?
銆銆3錛?濡傛灉P1鍜孭2妯潗鏍囦笉鍚岋紝浣嗘槸Q1鍜孮2妯潗鏍囩浉鍚岋紝鍗矻1騫寵浜嶻杞達紝鍒欎氦鐐規(guī)í鍧愭爣涓篞1鐨勬í鍧愭爣錛屼唬鍏ュ埌L0鐨勭洿綰挎柟紼嬩腑鍙互璁$畻鍑轟氦鐐圭旱鍧愭爣錛?
銆銆4錛?濡傛灉P1鍜孭2綰靛潗鏍囩浉鍚岋紝鍗矻0騫寵浜嶺杞?
銆銆a) 鑻1涔熷鉤琛屼簬X杞達紝
銆銆i. 鑻1鐨勬í鍧愭爣鍜孮1鐨勬í鍧愭爣鐩稿悓錛岃鏄嶭0鍜孡1鍏辯嚎錛屽亣濡侺1鏄洿綰跨殑璇濅粬浠湁鏃犵┓鐨勪氦鐐癸紝鍋囧L1鏄嚎孌電殑璇濆彲鐢?璁$畻涓ゆ潯鍏辯嚎綰挎鐨勪氦鐐?鐨勭畻娉曟眰浠栦滑鐨勪氦鐐癸紙璇ユ柟娉曞湪鍓嶆枃宸茶璁鴻繃錛夛紱
銆銆ii. 鍚﹀垯璇存槑L0鍜孡1騫寵錛屼粬浠病鏈変氦鐐癸紱
銆銆b) 鑻1涓嶅鉤琛屼簬X杞達紝鍒欎氦鐐圭旱鍧愭爣涓篜1鐨勭旱鍧愭爣錛屼唬鍏ュ埌L1鐨勭洿綰挎柟紼嬩腑鍙互璁$畻鍑轟氦鐐規(guī)í鍧愭爣錛?
銆銆5錛?濡傛灉P1鍜孭2綰靛潗鏍囦笉鍚岋紝浣嗘槸Q1鍜孮2綰靛潗鏍囩浉鍚岋紝鍗矻1騫寵浜嶺杞達紝鍒欎氦鐐圭旱鍧愭爣涓篞1鐨勭旱鍧愭爣錛屼唬鍏ュ埌L0鐨勭洿綰挎柟紼嬩腑鍙互璁$畻鍑轟氦鐐規(guī)í鍧愭爣錛?
銆銆6錛?鍓╀笅鐨勬儏鍐靛氨鏄疞1鍜孡0鐨勬枩鐜囧潎瀛樺湪涓斾笉涓?鐨勬儏鍐?
銆銆a) 璁$畻鍑篖0鐨勬枩鐜嘖0錛孡1鐨勬枩鐜嘖1 錛?
銆銆b) 濡傛灉K1 = K2
銆銆i. 濡傛灉Q1鍦↙0涓婏紝鍒欒鏄嶭0鍜孡1鍏辯嚎錛屽亣濡侺1鏄洿綰跨殑璇濇湁鏃犵┓浜ょ偣錛屽亣濡侺1鏄嚎孌電殑璇濆彲鐢?璁$畻涓ゆ潯鍏辯嚎綰挎鐨勪氦鐐?鐨勭畻娉曟眰浠栦滑鐨勪氦鐐癸紙璇ユ柟娉曞湪鍓嶆枃宸茶璁鴻繃錛夛紱
銆銆ii. 濡傛灉Q1涓嶅湪L0涓婏紝鍒欒鏄嶭0鍜孡1騫寵錛屼粬浠病鏈変氦鐐廣?br>
銆銆c) 鑱旂珛涓ょ洿綰跨殑鏂圭▼緇勫彲浠ヨВ鍑轟氦鐐規(guī)潵
銆銆榪欎釜綆楁硶騫朵笉澶嶆潅錛屼絾鏄鍒嗘儏鍐佃璁烘竻妤氾紝灝ゅ叾鏄綋涓ゆ潯綰挎鍏辯嚎鐨勬儏鍐甸渶瑕佸崟鐙冭檻錛屾墍浠ュ湪鍓嶆枃灝嗘眰涓ゆ潯鍏辯嚎綰挎鐨勭畻娉曞崟鐙啓鍑烘潵銆傚彟澶栵紝涓寮濮嬪氨鍏堝埄鐢ㄧ煝閲忓弶涔樺垽鏂嚎孌典笌綰挎錛堟垨鐩寸嚎錛夋槸鍚︾浉浜わ紝濡傛灉緇撴灉鏄浉浜わ紝閭d箞鍦ㄥ悗闈㈠氨鍙互灝嗙嚎孌靛叏閮ㄧ湅浣滅洿綰挎潵鑰冭檻銆傞渶瑕佹敞鎰忕殑鏄紝鎴戜滑鍙互灝嗙洿綰挎垨綰挎鏂圭▼鏀瑰啓涓篴x+by+c=0鐨勫艦寮忥紝榪欐牱涓鏉ヤ笂榪拌繃紼嬬殑閮ㄥ垎姝ラ鍙互鍚堝茍錛岀緝鐭簡浠g爜闀垮害錛屼絾鏄敱浜庡厛瑕佹眰鍑哄弬鏁幫紝榪欑綆楁硶灝嗚姳璐規(guī)洿澶氱殑鏃墮棿銆?
姹傜嚎孌墊垨鐩寸嚎涓庢姌綰褲佺煩褰€佸杈瑰艦鐨勪氦鐐癸細
鍒嗗埆姹備笌姣忔潯杈圭殑浜ょ偣鍗沖彲銆?
姹傜嚎孌墊垨鐩寸嚎涓庡渾鐨勪氦鐐?
銆銆璁懼渾蹇冧負O錛屽渾鍗婂緞涓簉錛岀洿綰匡紙鎴栫嚎孌碉級L涓婄殑涓ょ偣涓篜1,P2銆?
銆銆1. 濡傛灉L鏄嚎孌典笖P1錛孭2閮藉寘鍚湪鍦哋鍐咃紝鍒欐病鏈変氦鐐癸紱鍚﹀垯榪涜涓嬩竴姝ャ?
銆銆2. 濡傛灉L騫寵浜嶻杞達紝
銆銆a) 璁$畻鍦嗗績鍒癓鐨勮窛紱籨is錛?br>銆銆b) 濡傛灉dis > r 鍒橪鍜屽渾娌℃湁浜ょ偣錛?br>銆銆c) 鍒╃敤鍕捐偂瀹氱悊錛屽彲浠ユ眰鍑轟袱浜ょ偣鍧愭爣錛屼絾瑕佹敞鎰忚冭檻L鍜屽渾鐨勭浉鍒囨儏鍐點?br>
銆銆3. 濡傛灉L騫寵浜嶺杞達紝鍋氭硶涓嶭騫寵浜嶻杞寸殑鎯呭喌綾諱技錛?
銆銆4. 濡傛灉L鏃笉騫寵X杞翠篃涓嶅鉤琛孻杞達紝鍙互姹傚嚭L鐨勬枩鐜嘖錛岀劧鍚庡垪鍑篖鐨勭偣鏂滃紡鏂圭▼錛屽拰鍦嗘柟紼嬭仈绔嬪嵆鍙眰瑙e嚭L鍜屽渾鐨勪袱涓氦鐐癸紱
銆銆5. 濡傛灉L鏄嚎孌碉紝瀵逛簬2錛?錛?涓眰鍑虹殑浜ょ偣榪樿鍒嗗埆鍒ゆ柇鏄惁灞炰簬璇ョ嚎孌電殑鑼冨洿鍐呫?
鍑稿寘鐨勬蹇碉細
銆銆鐐歸泦Q鐨勫嚫鍖?convex hull)鏄寚涓涓渶灝忓嚫澶氳竟褰紝婊¤凍Q涓殑鐐規(guī)垨鑰呭湪澶氳竟褰㈣竟涓婃垨鑰呭湪鍏跺唴銆備笅鍥句腑鐢辯孩鑹茬嚎孌佃〃紺虹殑澶氳竟褰㈠氨鏄偣闆哘={p0,p1,...p12}鐨勫嚫鍖呫?/p>

銆銆鐜板湪宸茬粡璇佹槑浜嗗嚫鍖呯畻娉曠殑鏃墮棿澶嶆潅搴︿笅鐣屾槸O(n*logn),浣嗘槸褰撳嚫鍖呯殑欏剁偣鏁癶涔熻鑰冭檻榪涘幓鐨勮瘽錛孠rikpatrick鍜孲eidel鐨勫壀鏋濇悳绱㈢畻娉曞彲浠ヨ揪鍒癘(n*logh)錛屽湪娓愯繘鎰忎箟涓嬭揪鍒版渶浼樸傛渶甯哥敤鐨勫嚫鍖呯畻娉曟槸Graham鎵弿娉曞拰Jarvis姝ヨ繘娉曘傛湰鏂囧彧綆鍗曚粙緇嶄竴涓婫raham鎵弿娉曪紝鍏舵紜х殑璇佹槑鍜孞arvis姝ヨ繘娉曠殑榪囩▼澶у鍙互鍙傝冦婄畻娉曞璁恒嬨?
銆銆瀵逛簬涓涓湁涓変釜鎴栦互涓婄偣鐨勭偣闆哘錛孏raham鎵弿娉曠殑榪囩▼濡備笅錛?
銆銆浠0涓篞涓璝-X鍧愭爣鎺掑簭涓嬫渶灝忕殑鐐?
銆銆璁?lt;p1,p2,...pm>涓哄鍏朵綑鐐規(guī)寜浠0涓轟腑蹇冪殑鏋佽閫嗘椂閽堟帓搴忔墍寰楃殑鐐歸泦錛堝鏋滄湁澶氫釜鐐規(guī)湁鐩稿悓鐨勬瀬瑙掞紝闄や簡璺漰0鏈榪滅殑鐐瑰鍏ㄩ儴縐婚櫎
銆銆鍘媝0榪涙爤S
銆銆鍘媝1榪涙爤S
銆銆鍘媝2榪涙爤S
銆銆for i ← 3 to m
銆銆do while 鐢盨鐨勬爤欏跺厓绱犵殑涓嬩竴涓厓绱犮丼鐨勬爤欏跺厓绱犱互鍙妏i鏋勬垚鐨勬姌綰挎涓嶆嫄鍚戝乏渚?br>銆銆瀵筍寮規(guī)爤
銆銆鍘媝i榪涙爤S
銆銆return S;
銆銆姝よ繃紼嬫墽琛屽悗錛屾爤S鐢卞簳鑷抽《鐨勫厓绱犲氨鏄疩鐨勫嚫鍖呴《鐐規(guī)寜閫嗘椂閽堟帓鍒楃殑鐐瑰簭鍒椼傞渶瑕佹敞鎰忕殑鏄紝鎴戜滑瀵圭偣鎸夋瀬瑙掗嗘椂閽堟帓搴忔椂錛屽茍涓嶉渶瑕佺湡姝f眰鍑烘瀬瑙掞紝鍙渶瑕佹眰鍑轟換鎰忎袱鐐圭殑嬈″簭灝卞彲浠ヤ簡銆傝岃繖涓楠ゅ彲浠ョ敤鍓嶈堪鐨勭煝閲忓弶縐ц川瀹炵幇銆?
鍥涖佺粨璇?/strong>
銆銆灝界浜虹被瀵瑰嚑浣曞鐨勭爺絀朵粠鍙や唬璧蜂究娌℃湁涓柇榪囷紝浣嗘槸鍏蜂綋鍒板熷姪璁$畻鏈烘潵瑙e喅鍑犱綍闂鐨勭爺絀訛紝榪樺彧鏄仠鐣欏湪涓涓垵綰ч樁孌碉紝鏃犺浠庡簲鐢ㄩ鍩熻繕鏄彂灞曞墠鏅潵鐪嬶紝璁$畻鍑犱綍瀛﹂兘鍊煎緱鎴戜滑璁ょ湡瀛︿範銆佸姞浠ヨ繍鐢紝甯屾湜榪欑瘒鏂囩珷鑳藉甫浣犺蛋榪涜繖涓赴瀵屽褰╃殑涓栫晫銆?/p>
鐩墠鎴戠煡閬撶殑姹傞嗗簭鏈蹇殑閫傚悎ACM/ICPC鐨勭畻娉曟槸褰掑茍鎺掑簭鏃惰綆楅嗗簭涓暟錛屾椂闂村鏉傚害鏄痭log2n錛岃岀┖闂村鏉傚害2n銆侸AVA妯℃澘錛堟湇鍔″櫒鏄牎鍐呯殑錛夈?/p>
褰掑茍姹傞嗗簭綆鍗曞師鐞嗭細
褰掑茍鎺掑簭鏄垎娌葷殑鎬濇兂錛屽叿浣撳師鐞嗚嚜宸卞幓鐪嬩功鍚с傚埄鐢ㄥ綊騫舵眰閫嗗簭鏄寚鍦ㄥ瀛愬簭鍒?s1鍜宻2鍦ㄥ綊騫舵椂錛岃嫢s1[i]>s2[j]錛堥嗗簭鐘跺喌錛夛紝鍒欓嗗簭鏁板姞涓妔1.length-i,鍥犱負s1涓璱鍚庨潰鐨勬暟瀛楀浜巗2[j]閮芥槸閫嗗簭鐨勩?/p>
TJU 2242:
鐩存帴涓婃ā鏉匡紝璁板緱m鐨勫鍋惰鑰冭檻鐨勫摝銆?/p>
PKU 1007:
姹傞嗗簭鏁幫紝鐒跺悗鎺掑簭杈撳嚭灝辮浜嗐?/p>
PKU 1804, PKU 2299:
鏄渶綆鍗曠殑鍏充簬閫嗗簭瀵圭殑棰樼洰錛岄鐩ぇ鎰忔槸緇欏嚭涓涓簭鍒楋紝姹傛渶灝戠Щ鍔ㄥ灝戞鍙兘浣垮畠欏哄簭錛岃瀹氬彧鑳界浉閭?cè)潷诲姩銆?br>鐩擱偦縐誨姩鐨勮瘽錛屽亣璁綼 b 鐩擱偦錛岃嫢a<b 浜ゆ崲浼氬鍔犻嗗簭鏁幫紝鎵浠ユ渶濂戒笉瑕佸仛姝や氦鎹紱鑻==b 浜ゆ崲鏃犳剰鎬濓紝涔熶笉瑕佽繘琛屾浜ゆ崲錛沘>b鏃訛紝浜ゆ崲浼氬噺灝戦嗗簭錛屼嬌搴忓垪鏇撮『搴忥紝鎵浠ュ仛浜ゆ崲銆?br>鐢變笂鍙煡錛屾墍璋撶殑縐誨姩鍙湁涓縐嶆儏鍐碉紝鍗砤>b錛屼笖涓嬈$Щ鍔ㄧ殑緇撴灉鏄嗗簭鍑?銆傚亣璁懼垵濮嬮嗗簭鏄痭錛屾瘡嬈$Щ鍔ㄥ噺1錛岄偅涔堝氨闇瑕乶嬈$Щ鍔ㄦ椂搴忓垪鍙樹負欏哄簭銆傛墍浠ラ鐩漿鍖栦負鐩存帴姹傚簭鍒楃殑閫嗗簭渚垮彲浠ヤ簡銆?/p>
ZJU 1481:
榪欓鍜屾湰嬈¢閫夎禌鐨凢鐣ユ湁鐩鎬技錛屼笉榪囪綆鍗曞緱澶氥傞鎰忔槸緇欏畾搴忓垪s錛岀劧鍚庝緷嬈″皢搴忓垪棣栭」縐昏嚦搴忓垪灝撅紝榪欐牱鍏辨湁n-1嬈℃搷浣滀究鍥炲埌浜嗗師搴忓垪錛堟搷浣滅被浼間簬寰幆宸︾Щ錛夈傞棶榪檔-1嬈℃搷浣滃拰鍘熷簭鍒楋紝浠栦滑鐨勯嗗簭鏁版渶灝忕殑涓嬈℃槸澶氬皯錛?br>鏈夋ā鏉垮湪鎵嬶紝鐩磋鍦板彲浠ユ兂鍒版槸錛屽浜庤繖n嬈¢兘姹傞嗗簭鏁幫紝鐒跺悗杈撳嚭鏈灝忕殑涓嬈″氨鍙互浜嗭紝浣嗚繖鏍峰仛鐨勫鏉傚害鏈塐(n*nlogn),澶繃澶嶆潅銆?br>濡傛灉鍙眰鍒濆搴忓垪鐨勯嗗簭鏁扮殑璇濓紝鍙鍚庨潰鐨刵-1嬈℃搷浣滅殑閫嗗簭鏁拌兘澶熷湪O(1)鐨勭畻娉曚笅姹傚緱錛屽氨鑳戒繚璇佹諱綋O(nlogn)鐨勫鏉傚害浜嗐備簨瀹炰笂錛屽浜庢瘡嬈℃搷浣滅‘瀹炲彲浠ョ敤O(1)鐨勭畻娉曟眰寰楅嗗簭鏁般傚皢搴忓垪涓璦i縐誨埌aj鐨勫悗闈紝灝辨槸ai鍋歫-i嬈′笌鍙抽偦鐨勪氦鎹紝鑰屾瘡嬈′氦鎹㈡湁涓変釜緇撴灉錛氶嗗簭+1銆侀嗗簭-1銆侀嗗簭涓嶅彉銆傜敱浜庨鐩腑璇存槑搴忓垪涓棤鐩稿悓欏癸紝鎵浠ラ嗗簭涓嶅彉鍙互蹇界暐銆傞嗗簭鐨勫姞鍑忔槸鐪媋i涓巃j闂達紙鍖呮嫭aj錛夌殑鏁板瓧澶у皬鍏崇郴錛屾墍浠ユ眰鍑篴i涓巃j闂村ぇ浜巃i鐨勬暟瀛椾釜鏁板拰灝忎簬ai鐨勬暟瀛椾釜鏁扮劧鍚庡彇宸紝灝辨槸ai縐誨姩鍒癮j鍚庨潰鎵瀵艱嚧鐨勯嗗簭鍊煎彉鍖栦簡銆?br>渚濇嵁涓婇潰鐨勯亾鐞嗭紝鍥犱負棰樼洰鏈夎姹俛i鏄Щ鍔ㄥ埌鏈鍚庝竴涓暟錛岃宎i鍙堝繀瀹氭槸澶撮」錛屾墍浠ュ彧瑕佽綆楀ぇ浜巃i鐨勪釜鏁板拰灝忎簬ai鐨勪釜鏁頒箣宸氨琛屼簡銆傜劧鍚庢瘡嬈″浜庡墠涓嬈$殑閫嗗簭鏁板姞涓婅繖涓樊錛屽氨鏄粡榪囪繖嬈℃搷浣滃悗鐨勯嗗簭鏁板間簡銆?/p>
PKU 2086:
榪欓涓嶆槸姹傞嗗簭瀵癸紝鑰屾槸鐭ラ亾閫嗗簭鏁発鏉ュ埗閫犱竴涓簭鍒椼傝姹傚簭鍒楁渶灝忥紝涓や釜搴忓垪姣旇緝澶у皬鏄嚜宸﹀悜鍙充緷嬈℃瘮杈冮」錛屾嫢鏈夎緝澶ч」鐨勫簭鍒楀ぇ銆?
鍏跺疄閫犲簭鍒楀茍涓嶉毦錛岀敱1804鍙煡錛屽彧瑕佸鐩擱偦鏁板仛璋冩暣灝辮兘鍋氬埌鏌愪釜閫嗗簭鏁頒簡銆傞毦鐐規(guī)槸鍦ㄦ眰鏈灝忕殑搴忓垪銆備婦渚?1 2 3 4 5,瑕佹眰閫嗗簭1鐨勬渶灝忓簭鍒楁槸浜ゆ崲4 5錛屽鏋滀氦鎹㈠叾浠栦換鎰忕浉閭繪暟閮芥棤娉曚繚璇佹渶灝忋傜敱姝ゅ彲浠ユ兂鍒幫紝瑕佷繚璇佸簭鍒楁渶灝忥紝鍓嶉儴鍒嗗簭鍒楀彲浠ヤ笉鍔紙鍥犱負浠栦滑宸茬粡鏄渶灝忕殑浜嗭級錛屽彧鏀瑰姩鍚庡崐閮ㄥ垎銆傝屾垜浠煡閬搉涓暟鐨勬渶澶ч嗗簭鏁版槸n*(n-1)/2錛屾墍浠ュ彲浠ユ眰涓涓渶灝忕殑p錛屼嬌寰?k<p*(p-1)/2銆傚緱鍒板墠鍗婇儴鍒嗘槸1鍒皀-p錛屾墍鏈夌殑閫嗗簭閮芥槸鐢卞悗鍗婇儴鍒唒涓暟瀹屾垚鐨勩?br>鑰冭檻k=7,n=6鐨勬儏鍐碉紝姹傚緱p=5,鍗沖墠閮ㄥ垎1涓嶅姩錛屽悗闈?涓暟瀛楄皟鏁淬?涓暟鐨勬渶澶ч嗗簭鏄? 4 3 2,閫嗗簭鏁版槸6錛?涓暟鏄? 5 4 3 2,閫嗗簭鏁版槸10銆傚彲浠ョ寽鎯沖埌錛屼繚璇?涓?涓暟鐨勯嗗簭涓嶅姩錛岃皟鏁村彟涓涓暟鐨勪綅緗氨鍙互澧炲姞鎴栧噺灝戦嗗簭鏁幫紝榪欐牱灝辮兘璋冩暣鍑?-10闂寸殑浠繪剰閫嗗簭銆備負浜嗕繚璇佹渶灝忥紝鎴戜滑鍙互鍙栧敖閲忓皬鐨勬暟鍓嶇Щ鍒版渶宸︾殑浣嶇疆灝辮浜嗐?鍓嶇Щ鍚庨嗗簭璋冩暣4錛?鍓嶇Щ鍚庤皟鏁翠簡3錛?璋冩暣2錛?璋冩暣1錛屼笉鍔ㄦ槸璋冩暣0錛屽彲浠ラ氳繃榪欐牱璋冩暣寰楀埌鍑?-10錛屾墍浠ヨ寰嬪氨鏄壘鍒伴渶瑕佽皟鏁寸殑鏁幫紝鍓╀笅鐨勯儴鍒嗗氨閫嗗簭杈撳嚭銆傞渶瑕佽皟鏁寸殑鏁板彲浠ラ氳繃鎬婚嗗簭k-(p-1)*(p-2)/2+(n-p)姹傚緱銆?/p>
PKU 1455:
榪欐槸涓閬撴瘮杈冮毦鐨勫叧浜庨嗗簭鏁版帹鐞嗙殑棰樼洰錛岄鐩姹傛槸n浜虹粍鎴愪竴涓幆錛屾眰鍋氱浉閭諱氦鎹㈢殑鎿嶄綔鏈灝戝灝戞鍙互浣挎瘡涓漢宸﹀彸鐨勯偦灞呬簰鎹紝鍗沖師鍏堝乏杈圭殑鍒板彸杈瑰幓錛屽師鍙寵竟鐨勫幓宸﹁竟銆傚鏄撴兂鍒扮殑鏄粰n涓漢緙栧彿錛屼粠1..n錛岄偅涔堝垵濮嬫佹槸1..n鐒跺悗n鍙寵竟鏄?錛岀洰鏍囨佹槸n..1錛宯宸﹁竟鏄?銆?br>鍒濇鐪嬩笂鍘誨ソ璞$粨鏋滃氨鏄眰涓嬮嗗簭錛坣*(n-1)/2 ?錛夛紝浣嗘槸闅劇偣鏄棰樼殑搴忓垪鏄竴涓幆銆傚湪鐜殑鎯呭喌涓嬶紝鍙互鍑忓皯璁稿嬈$Щ鍔ㄣ傚厛浠庨潪鐜殑鎯呭喌鎬濊冿紝鍘?-n鐨勫簭鍒楄杞寲鎴恘-1鐨勫簭鍒楋紝灝辨槸鍋歯(n-1)/2嬈℃搷浣溿傚洜涓烘槸鐜紝鎵浠?k)..1,n..k+1涔熷彲浠ョ畻鏄洰鏍囨併備緥濡傦細1 2 3 4 5 6鐨勭洰鏍囧彲浠ユ槸 6 5 4 3 2 1,涔熷彲浠ユ槸 4 3 2 1 6 5銆傛墍浠ワ紝闂鍙互杞寲涓烘眰褰㈠(k)..1,n..k+1鐨勭洰鏍囨佷腑k鍙栦綍鍊兼椂錛岄嗗簭鏁版渶灝忋?br>緇忚繃涓婇潰鐨勬楠わ紝闂宸茬粡鍜孼JU1481綾諱技鐨勩備絾鍏跺疄錛岃繕鏄湁瑙勫緥鍙驚鐨勩傚浜庢煇k錛屼粬鐨勯嗗簭鏁版槸宸﹁竟鐨勯嗗簭鏁?鍙寵竟鐨勯嗗簭鏁幫紝涔熷氨鏄?k*(k-1)/2)+((n-k)*(n-k-1)/2) 錛坘>=1 && k<=n錛夈傚睍寮涓涓嬶紝鍙互姹傚緱k絳変簬n/2鏃墮嗗簭鏁版渶灝忎負((n*n-n)/2)錛岀幇鍦ㄦ妸k浠e叆榪涘幓灝卞彲浠ュ緱鍒拌В浜嗐?br>瑕佹敞鎰忕殑鏄痥鏄暣鏁幫紝n/2涓嶄竴瀹氭槸鏁存暟錛屾墍浠ュ叕寮忚繕鏈変慨鏀圭殑浣欏湴錛屽彲浠ラ氱敤鍦版敼涓?n/2)*(n-1)/2銆?/p>
PKU 2893:
鐢ㄥ埌浜嗘眰閫嗗簭鏁扮殑鎬濇兂錛屼絾閽堝棰樼洰榪樻湁浼樺寲錛屽彲瑙丮*N PUZZLE鐨勪紭鍖栥?/p>
PKU 1077:
姣旇緝緇忓吀鐨勬悳绱㈤錛屼絾鍦ㄥ垽鏂棤瑙g殑鎯呭喌涓嬶紝閫嗗簭鏁板府浜嗗ぇ蹇欙紝鍙鍏暟鐮佸疄楠屾姤鍛娿?/p>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/ray58750034/archive/2006/10/08/1325939.aspx
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/ray58750034/archive/2006/10/08/1325939.aspx
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/ray58750034/archive/2006/10/08/1325939.aspx
涓鑸噰鍙栨爲褰㈢粨鏋勬潵瀛樺偍騫舵煡闆嗭紝鍦ㄥ悎騫舵搷浣滄椂鍙互鍒╃敤鏍戠殑鑺傜偣鏁?鍔犳潈瑙勫垯)鎴栬呭埄鐢ㄤ竴涓猺ank鏁扮粍鏉ュ瓨鍌ㄩ泦鍚堢殑娣卞害涓嬬晫--鍚彂寮忓嚱鏁幫紝鍦ㄦ煡鎵炬搷浣滄椂榪涜璺緞鍘嬬緝浣垮悗緇殑鏌ユ壘鎿嶄綔鍔犻熴?/font>榪欐牱浼樺寲瀹炵幇鐨勫茍鏌ラ泦錛岀┖闂村鏉傚害涓篛(N)錛屽緩绔嬩竴涓泦鍚堢殑鏃墮棿澶嶆潅搴︿負O(1)錛孨嬈″悎騫禡鏌ユ壘鐨勬椂闂村鏉傚害涓篛(M Alpha(N))錛岃繖閲孉lpha鏄疉ckerman鍑芥暟鐨勬煇涓弽鍑芥暟錛屽湪寰堝ぇ鐨勮寖鍥村唴榪欎釜鍑芥暟鐨勫煎彲浠ョ湅鎴愭槸涓嶅ぇ浜?鐨勶紝鎵浠ュ茍鏌ラ泦鐨勬搷浣滃彲浠ョ湅浣滄槸綰挎х殑銆?br>瀹冩敮鎸佷互涓嬩笁縐嶆搷浣? 浠ヤ笅緇欏嚭鎴戠殑涓ょ瀹炵幇: POJ 1611 The Suspects 鏈鍩虹鐨勫茍鏌ラ泦 JOJ 1905 Freckles == POJ 2560 鏈灝忕敓鎴愭爲 娉曚竴錛歅rim綆楁硶錛涙硶浜岋細騫舵煡闆嗗疄鐜?font color=#000000>Kruskar綆楁硶姹傛渶灝忕敓鎴愭爲
銆銆錛峌nion (Root1, Root2) //鍚堝茍鎿嶄綔錛涙妸瀛愰泦鍚圧oot2鍜屽瓙闆嗗悎Root1鍚堝茍.瑕佹眰錛歊oot1鍜?Root2浜掍笉鐩鎬氦,鍚﹀垯涓嶆墽琛屾搷浣?
銆銆錛岶ind (x) //鎼滅儲鎿嶄綔錛涙悳绱㈠厓绱爔鎵鍦ㄧ殑闆嗗悎,騫惰繑鍥炶闆嗗悎鐨勫悕瀛?-鏍硅妭鐐?
銆銆錛峌FSets (s) //鏋勯犲嚱鏁般傚皢騫舵煡闆嗕腑s涓厓绱犲垵濮嬪寲涓簊涓彧鏈変竴涓崟鍏冪礌鐨勫瓙闆嗗悎.
銆銆錛嶅浜庡茍鏌ラ泦鏉ヨ錛屾瘡涓泦鍚堢敤涓媯墊爲琛ㄧず銆?br>銆銆錛嶉泦鍚堜腑姣忎釜鍏冪礌鐨勫厓绱犲悕鍒嗗埆瀛樻斁鍦ㄦ爲鐨勭粨鐐逛腑錛屾澶栵紝鏍戠殑姣忎竴涓粨鐐硅繕鏈変竴涓寚鍚戝叾鍙屼翰緇撶偣鐨勬寚閽堛?nbsp;
錛嶄負綆鍖栬璁猴紝蹇界暐瀹為檯鐨勯泦鍚堝悕錛屼粎鐢ㄨ〃紺洪泦鍚堢殑鏍戠殑鏍規(guī)潵鏍囪瘑闆嗗悎銆?/p>
//Abstract: UFSet
2
3
//Author:Lifeng Wang 錛團andywang錛?br> 4
5
6
7
8
// Model One 涓嶮odel 2 璺緞鍘嬬緝鏂瑰紡涓嶅悓,鍚堝茍鏍囧噯涓嶅悓
9
10
const int MAXSIZE = 500010;
11
12
int rank[MAXSIZE]; // 鑺傜偣楂樺害鐨勪笂鐣?/span>
13
14
int parent[MAXSIZE]; // 鏍硅妭鐐?/span>
15
16
int FindSet(int x)
{// 鏌ユ壘+閫掑綊鐨勮礬寰勫帇緙?/span>
17
18
if( x != parent[x] ) parent[x] = FindSet(parent[x]);
19
20
return parent[x];
21
22
}
23
24
void Union(int root1, int root2)
{
25
26
int x = FindSet(root1), y = FindSet(root2);
27
28
if( x == y ) return ;
29
30
if( rank[x] > rank[y] ) parent[y] = x;
31
32
else
{
33
34
parent[x] = y;
35
36
if( rank[x] == rank[y] ) ++rank[y];
37
38
}
39
40
}
41
42
void Initi(void)
{
43
44
memset(rank, 0, sizeof(rank));
45
46
for( int i=0; i < MAXSIZE; ++i ) parent[i] = i;
47
48
}
49
50
51
52
53
// Model Two
54
55
const int MAXSIZE = 30001;
56
57
int pre[MAXSIZE]; //鏍硅妭鐐筰,pre[i] = -num,鍏朵腑num鏄鏍戠殑鑺傜偣鏁扮洰;
58
59
//闈炴牴鑺傜偣j,pre[j] = k,鍏朵腑k鏄痡鐨勭埗鑺傜偣
60
61
int Find(int x)
{//鏌ユ壘+闈為掑綊鐨勮礬寰勫帇緙?/span>
62
63
int p = x;
64
65
while( pre[p] > 0 ) p = pre[p];
66
67
while( x != p )
{
68
69
int temp = pre[x]; pre[x] = p; x = temp;
70
71
}
72
73
return x;
74
75
}
76
77
void Union(int r1, int r2)
{
78
79
int a = Find(r1); int b = Find(r2);
80
81
if( a == b ) return ;
82
83
//鍔犳潈瑙勫垯鍚堝茍
84
85
if( pre[a] < pre[b] )
{
86
87
pre[a] += pre[b]; pre[b] = a;
88
89
}
90
91
else
{
92
93
pre[b] += pre[a]; pre[a] = b;
94
95
}
96
97
}
98
99
void Initi(void)
100
101

{
102
103
for( int i=0; i < N; ++i ) pre[i] = -1;
104
105
} 銆銆
106
107
騫舵煡闆嗙殑涓浜涢鐩拰鎴戠殑鐩稿叧瑙i鎶ュ憡:
POJ 2524 Ubiquitous Religions 鏈鍩烘湰鐨勫茍鏌ラ泦
POJ 1182 椋熺墿閾?/u> 騫舵煡闆嗙殑鎷撳睍
娉ㄦ剰: 鍙湁涓緇勬暟鎹?
瑕佸厖鍒嗗埄鐢ㄩ鎰忔墍緇欐潯浠?鏈変笁綾誨姩鐗〢,B,C錛岃繖涓夌被鍔ㄧ墿鐨勯鐗╅摼
鏋勬垚浜嗘湁瓚g殑鐜艦銆侫鍚傿錛?B鍚僀錛孋鍚傾銆備篃灝辨槸璇?鍙湁涓変釜group
POJ 2492 A Bug's Life 騫舵煡闆嗙殑鎷撳睍
娉曚竴:娣卞害浼樺厛閬嶅巻
姣忔閬嶅巻璁板綍涓嬭鐐規(guī)槸鐢瘋繕鏄コ錛屽彧鏈?鐢?銆夊コ錛屽コ-銆夌敺婊¤凍錛屽惁鍒欙紝鎵懼埌鍚屾ф亱錛岀粨鏉熺▼搴忋?br>娉曚簩:浜屽垎鍥懼尮閰?br>娉曚笁:騫舵煡闆嗙殑鎷撳睍:鍜?182寰堝儚錛屽彧涓嶈繃榪欓噷灝辨湁涓ょ粍錛岃?182鏄笁緇?1611鏃犻檺鍒?br>POJ 1861 Network == zju_1542 騫舵煡闆?鑷畾涔夋帓搴?璐績姹?鏈灝忕敓鎴愭爲"
絳旀涓嶅敮涓錛屼笉榪囧湪ZOJ涓婄敤QSORT()鍜孲ORT()閮借兘榪囷紝鍦≒OJ涓婂彧鏈塖ORT()鎵嶈兘榪?..
POJ 1703 Find them, Catch them 騫舵煡闆嗙殑鎷撳睍
榪欎釜鍜?/font>POJ 2492 A Bug's Life寰堝儚錛屽氨鏄妸浠g爜紼嶅井淇敼浜嗕竴涓嬪氨AC浜嗭紒
娉ㄦ剰錛欰nd of course, at least one of them belongs to Gang Dragon, and the same for Gang Snake. 灝辨槸璇村彧鏈変袱涓粍銆?br>POJ 2236 Wireless Network 騫舵煡闆嗙殑搴旂敤
闇瑕佹敞鎰忕殑鍦版柟錛?銆佸茍鏌ラ泦錛?銆丯鐨勮寖鍥達紝鍙互絳変簬1001錛?銆佷粠N+1琛屽紑濮嬶紝絎竴涓緭鍏ョ殑鍙互鏄瓧絎︿覆銆?br>POJ 1988 Cube Stacking 騫舵煡闆嗗緢濂界殑搴旂敤
1銆佷笌 閾舵渤鑻遍泟浼犺==NOI2002 Galaxy涓鏍鳳紱2銆佸鍔犱簡涓涓暟緇刡ehind[x],璁板綍鎴樿埌x鍦ㄥ垪涓殑鐩稿浣嶇疆錛?銆佽緇嗚В棰樻姤鍛婅閾舵渤鑻遍泟浼犺銆?/font>
JOJ 1966 Super Market III == PKU 1456 Supermarket 甯﹂檺鍒剁殑浣滀笟鎺掑簭闂錛堣椽蹇?騫舵煡闆嗭級
鎻愰珮棰樼洰錛?br>POJ 2912 Rochambeau
POJ 1733 Parity game
POJ 1308 Is It A Tree?
void rmq_init()

{
int i,j;
for(j=1;j<=n;j++) mx[j][0]=d[j];
int m=floor(log((double)n)/log(2.0));
for(i=1;i<=m;i++)
for(j=0;j+(1<<(i-1))<=n;j++)
mx[j][i]=max(mx[j][i-1],mx[j+(1<<(i-1))][i-1]);
}
int rmq(int l,int r)

{
int m=floor(log((double)(r-l+1))/log(2.0));
int a=max(mx[l][m],mx[r-(1<<m)+1][m]);
return a;
}

涓婃鍦ㄦ箹澶э紝鍏朵腑鐨勪竴閬撻鏁版嵁寰堝己錛屾垜璇曚簡濂藉縐嶄紭鍖栭兘TLE錛岀浉淇″彧鑳界敤綰挎鏍戞墠鑳借繃銆傚洖鏉ヤ箣鍚庢殫鏆楀張瀛︿簡涓嬈$嚎孌墊爲錛屾兂鎯沖ソ鍍忔槸絎笁嬈″浜嗭紝鍍忕綉緇滄祦涓鏍鋒瘡瀛︿竴嬈¢兘鏈夋柊鐨勪綋浼氥?/p>
鎶婇棶棰樼畝鍖栦竴涓嬶細
鍦ㄨ嚜鐒舵暟錛屼笖鎵鏈夌殑鏁頒笉澶т簬30000鐨勮寖鍥村唴璁ㄨ涓涓棶棰橈細鐜板湪宸茬煡n鏉$嚎孌碉紝鎶婄鐐逛緷嬈¤緭鍏ュ憡璇変綘錛岀劧鍚庢湁m涓闂紝姣忎釜璇㈤棶杈撳叆涓涓偣錛岃姹傝繖涓偣鍦ㄥ灝戞潯綰挎涓婂嚭鐜拌繃錛?/p>
鏈鍩烘湰鐨勮В娉曞綋鐒跺氨鏄涓涓偣錛屽氨鎶婃墍鏈夌嚎孌墊瘮涓涓嬶紝鐪嬬湅鍦ㄤ笉鍦ㄧ嚎孌典腑錛?/p>
姣忔璇㈤棶閮借鎶妌鏉$嚎孌墊煡涓嬈★紝閭d箞m嬈¤闂紝灝辮榪愮畻m*n嬈★紝澶嶆潅搴﹀氨鏄疧(m*n)
榪欓亾棰榤鍜宯閮芥槸30000錛岄偅涔堣綆楅噺杈懼埌浜?0^9錛涜岃綆楁満1縐掔殑璁$畻閲忓ぇ綰︽槸10^8鐨勬暟閲忕駭錛屾墍浠ヨ繖縐嶆柟娉曟棤璁烘庝箞浼樺寲閮芥槸瓚呮椂
-----
鍥犱負n鏉$嚎孌墊槸鍥哄畾鐨勶紝鎵浠ユ煇縐嶇▼搴︿笂璇存瘡嬈¢兘鎶妌鏉$嚎孌墊煡涓閬嶆湁澶ч噺鐨勯噸澶嶅拰嫻垂錛?/p>
綰挎鏍戝氨鏄彲浠ヨВ鍐寵繖綾婚棶棰樼殑鏁版嵁緇撴瀯
涓句緥璇存槑錛氬凡鐭ョ嚎孌礫2,5] [4,6] [0,7]錛涙眰鐐?,4,7鍒嗗埆鍑虹幇浜嗗灝戞
鍦╗0,7]鍖洪棿涓婂緩绔嬩竴媯墊弧浜屽弶鏍戯細錛堜負浜嗗拰宸茬煡綰挎鍖哄埆錛岀敤銆愩戣〃紺虹嚎孌墊爲涓殑綰挎錛?/p>
銆?,7銆?/p>
/ \
銆?,3銆?nbsp; 銆?,7銆?/p>
/ \ / \
銆?,1銆?nbsp; 銆?,3銆?nbsp; 銆?,5銆?nbsp; 銆?,7銆?/p>
/ \ / \ / \ / \
銆?,0銆?銆?,1銆戙?,2銆?銆?,3銆?nbsp; 銆?,4銆?銆?,5銆?銆?,6銆?銆?,7銆?/p>
姣忎釜鑺傜偣鐢ㄧ粨鏋勪綋錛?/p>
struct line
{
int left,right;//宸︾鐐廣佸彸绔偣
int n;//璁板綍榪欐潯綰挎鍑虹幇浜嗗灝戞錛岄粯璁や負0
}a[16];
鍜屽爢綾諱技錛屾弧浜屽弶鏍戠殑鎬ц川鍐沖畾a[i]鐨勫乏鍎垮瓙鏄痑[2*i]銆佸彸鍎垮瓙鏄痑[2*i+1];
鐒跺悗瀵逛簬宸茬煡鐨勭嚎孌典緷嬈¤繘琛屾彃鍏ユ搷浣滐細
浠庢爲鏍瑰紑濮嬭皟鐢ㄩ掑綊鍑芥暟insert
void insert(int s,int t,int step)//瑕佹彃鍏ョ殑綰挎鐨勫乏绔偣鍜屽彸绔偣銆佷互鍙婂綋鍓嶇嚎孌墊爲涓殑鏌愭潯綰挎


{
if (s==a[step].left && t==a[step].right)

{
a[step].n++;//鎻掑叆鐨勭嚎孌靛尮閰嶅垯姝ゆ潯綰挎鐨勮褰?1
return;//鎻掑叆緇撴潫榪斿洖
}
if (a[step].left==a[step].right) return;//褰撳墠綰挎鏍戠殑綰挎娌℃湁鍎垮瓙錛屾彃鍏ョ粨鏉熻繑鍥?/span>
int mid=(a[step].left+a[step].right)/2;
if (mid>=t) insert(s,t,step*2);//濡傛灉涓偣鍦╰鐨勫彸杈癸紝鍒欏簲璇ユ彃鍏ュ埌宸﹀効瀛?/span>
else if (mid<s) insert(s,t,step*2+1);//濡傛灉涓偣鍦╯鐨勫乏杈癸紝鍒欏簲璇ユ彃鍏ュ埌鍙沖効瀛?/span>
else//鍚﹀垯錛屼腑鐐逛竴瀹氬湪s鍜宼涔嬮棿錛屾妸寰呮彃綰挎鍒嗘垚涓ゅ崐鍒嗗埆鎻掑埌宸﹀彸鍎垮瓙閲岄潰

{
insert(s,mid,step*2);
insert(mid+1,t,step*2+1);
}
}

涓夋潯宸茬煡綰挎鎻掑叆榪囩▼錛?/p>
[2,5]
--[2,5]涓庛?,7銆戞瘮杈冿紝鍒嗘垚涓ら儴鍒嗭細[2,3]鎻掑埌宸﹀効瀛愩?,3銆戯紝[4,5]鎻掑埌鍙沖効瀛愩?,7銆?/p>
--[2,3]涓庛?,3銆戞瘮杈冿紝鎻掑埌鍙沖効瀛愩?,3銆戯紱[4,5]鍜屻?,7銆戞瘮杈冿紝鎻掑埌宸﹀効瀛愩?,5銆?/p>
--[2,3]涓庛?,3銆戝尮閰嶏紝銆?,3銆戣褰?1錛沎4,5]涓庛?,5銆戝尮閰嶏紝銆?,5銆戣褰?1
[4,6]
--[4,6]涓庛?,7銆戞瘮杈冿紝鎻掑埌鍙沖効瀛愩?,7銆?/p>
--[4,6]涓庛?,7銆戞瘮杈冿紝鍒嗘垚涓ら儴鍒嗭紝[4,5]鎻掑埌宸﹀効瀛愩?,5銆戯紱[6,6]鎻掑埌鍙沖効瀛愩?,7銆?/p>
--[4,5]涓庛?,5銆戝尮閰嶏紝銆?,5銆戣褰?1錛沎6,6]涓庛?,7銆戞瘮杈冿紝鎻掑埌宸﹀効瀛愩?,6銆?/p>
--[6,6]涓庛?,6銆戝尮閰嶏紝銆?,6銆戣褰?1
[0,7]
--[0,7]涓庛?,7銆戝尮閰嶏紝銆?,7銆戣褰?1
鎻掑叆榪囩▼緇撴潫錛岀嚎孌墊爲涓婄殑璁板綍濡備笅錛堢孩鑹叉暟瀛椾負姣忔潯綰挎鐨勮褰昻錛夛細
銆?,7銆?/p>
1
/ \
銆?,3銆?nbsp; 銆?,7銆?/p>
0 0
/ \ / \
銆?,1銆?nbsp; 銆?,3銆?nbsp; 銆?,5銆?nbsp; 銆?,7銆?/p>
0 1 2 0
/ \ / \ / \ / \
銆?,0銆?銆?,1銆?銆?,2銆?銆?,3銆?銆?,4銆?銆?,5銆?銆?,6銆?銆?,7銆?/p>
0 0 0 0 0 0 1 0
璇㈤棶鎿嶄綔鍜屾彃鍏ユ搷浣滅被浼鹼紝涔熸槸閫掑綊榪囩▼錛岀暐
2鈥斺斾緷嬈℃妸銆?,7銆?銆?,3銆?銆?,3銆?銆?,2銆戠殑璁板綍n鍔犺搗鏉ワ紝緇撴灉涓?
4鈥斺斾緷嬈℃妸銆?,7銆?銆?,7銆?銆?,5銆?銆?,4銆戠殑璁板綍n鍔犺搗鏉ワ紝緇撴灉涓?
7鈥斺斾緷嬈℃妸銆?,7銆?銆?,7銆?銆?,7銆?銆?,7銆戠殑璁板綍n鍔犺搗鏉ワ紝緇撴灉涓?
涓嶇鏄彃鍏ユ搷浣滆繕鏄煡璇㈡搷浣滐紝姣忔鎿嶄綔鐨勬墽琛屾鏁頒粎涓烘爲鐨勬繁搴︹斺攍ogN
寤烘爲鏈塶嬈℃彃鍏ユ搷浣滐紝n*logN錛屼竴嬈℃煡璇㈣logN錛宮嬈″氨鏄痬*logN錛涙誨叡澶嶆潅搴(n+m)*logN錛岃繖閬撻N涓嶈秴榪?0000錛宭ogN綰︾瓑浜?4錛屾墍浠ヨ綆楅噺鍦?0^5锝?0^6涔嬮棿錛屾瘮鏅氭柟娉曞揩浜?000鍊嶏紱
榪欓亾棰樻槸綰挎鏍戞渶鍩烘湰鐨勬搷浣滐紝鍙敤鍒頒簡鎻掑叆鍜屾煡鎵撅紱鍒犻櫎鎿嶄綔鍜屾彃鍏ョ被浼鹼紝鎵╁睍鍔熻兘鐨勮繕鏈夋祴搴︺佽繛緇鏁扮瓑絳夛紝鍦∟鏁版嵁鑼冨洿寰堝ぇ鐨勬椂鍊欙紝渚濈劧鍙互鐢ㄧ鏁e寲鐨勬柟娉曞緩鏍戙?/p>
婀栧ぇ鐨勯偅閬撻鐩粫浜嗕釜灝忓集瀛愶紝alpc12鏈夎緇嗙殑棰樼洰鍜岃В棰樻姤鍛婏紝鏈夊叴瓚g殑璇濆彲浠ョ湅鐪?a href="http://m.shnenglu.com/sicheng/archive/2008/01/09/40791.html">http://m.shnenglu.com/sicheng/archive/2008/01/09/40791.html
綰挎鏍戠殑緇忓吀棰樼洰灝辨槸poj1177鐨刾icturehttp://acm.pku.edu.cn/JudgeOnline/problem?id=1177
Bellman-Ford綆楁硶涓庡彟涓涓潪甯歌憲鍚嶇殑Dijkstra綆楁硶涓鏍鳳紝鐢ㄤ簬姹傝В鍗曟簮鐐規(guī)渶鐭礬寰勯棶棰樸?/span>Bellman-ford綆楁硶闄や簡鍙眰瑙h竟鏉冨潎闈炶礋鐨勯棶棰樺錛岃繕鍙互瑙e喅瀛樺湪璐熸潈杈圭殑闂錛堟剰涔夋槸浠涔堬紝濂藉ソ鎬濊冿級錛岃?/span>Dijkstra綆楁硶鍙兘澶勭悊杈規(guī)潈闈炶礋鐨勯棶棰橈紝鍥犳 Bellman-Ford綆楁硶鐨勯傜敤闈㈣騫挎硾涓浜涖備絾鏄紝鍘熷鐨?/span>Bellman-Ford綆楁硶鏃墮棿澶嶆潅搴︿負 O錛?/span>VE錛?/span>,姣?/span>Dijkstra綆楁硶鐨勬椂闂村鏉傚害楂橈紝鎵浠ュ父甯歌浼楀鐨勫ぇ瀛︾畻娉曟暀縐戜功鎵蹇界暐錛屽氨榪炵粡鍏哥殑銆婄畻娉曞璁恒嬩篃鍙粙緇嶄簡鍩烘湰鐨?/span>Bellman-Ford綆楁硶錛屽湪鍥藉唴甯歌鐨勫熀鏈俊鎭濂ヨ禌鏁欐潗涓篃鍧囨湭鎻愬強錛屽洜姝よ綆楁硶鐨勭煡鍚嶅害涓庤鎺屾彙搴﹂兘涓嶅Dijkstra綆楁硶銆備簨瀹炰笂錛屾湁澶氱褰㈠紡鐨?/span>Bellman-Ford綆楁硶鐨勪紭鍖栧疄鐜般傝繖浜涗紭鍖栧疄鐜板湪鏃墮棿鏁堢巼涓婂緱鍒扮浉褰撴彁鍗囷紝渚嬪榪戜竴涓ゅ勾琚儹鎹х殑SPFA錛?/span>Shortest-Path Faster Algoithm 鏇村揩鐨勬渶鐭礬寰勭畻娉曪級綆楁硶鐨勬椂闂存晥鐜囩敋鑷崇敱浜?/span>Dijkstra綆楁硶錛屽洜姝ゆ垚涓轟俊鎭濂ヨ禌閫夋墜緇忓父璁ㄨ鐨勮瘽棰樸傜劧鑰岋紝闄愪簬璧勬枡鍖箯錛屾湁鍏?/span>Bellman-Ford綆楁硶鐨勮澶氶棶棰樺父甯稿洶鎵板ゥ璧涢夋墜銆傚錛氳綆楁硶鍊煎緱鎺屾彙涔堬紵鎬庢牱鐢ㄧ紪紼嬭璦鍏蜂綋瀹炵幇錛熸湁鍝簺浼樺寲錛熶笌SPFA綆楁硶鏈夊叧緋諱箞錛熸湰鏂囪瘯鍥懼Bellman-Ford綆楁硶鍋氫竴涓瘮杈冨叏闈㈢殑浠嬬粛銆傜粰鍑哄嚑縐嶅疄鐜扮▼搴忥紝浠庣悊璁哄拰瀹炴祴涓ゆ柟闈㈠垎鏋愪粬浠殑鏃墮棿澶嶆潅搴︼紝渚涘ぇ瀹跺湪澶囨垬鐪侀夊拰鍚庣畫鐨?/span>noi鏃跺弬鑰冦?/span>
Bellman-Ford綆楁硶鑳藉湪鏇存櫘閬嶇殑鎯呭喌涓嬶紙瀛樺湪璐熸潈杈癸級瑙e喅鍗曟簮鐐規(guī)渶鐭礬寰勯棶棰樸傚浜庣粰瀹氱殑甯︽潈錛堟湁鍚戞垨鏃犲悜錛夊浘 G=錛?/span>V,E錛夛紝鍏舵簮鐐逛負s錛屽姞鏉冨嚱鏁?/span> w鏄?/span> 杈歸泦 E 鐨勬槧灝勩傚鍥?/span>G榪愯Bellman-Ford綆楁硶鐨勭粨鏋滄槸涓涓竷?yōu)當鍊鹼紝琛ㄦ槑鍥句腑鏄惁瀛樺湪鐫涓涓粠婧愮偣s鍙揪鐨勮礋鏉冨洖璺?/span>鑻ヤ笉瀛樺湪榪欐牱鐨勫洖璺紝綆楁硶灝嗙粰鍑轟粠婧愮偣s鍒?/span> 鍥?/span>G鐨勪換鎰忛《鐐?/span>v鐨勬渶鐭礬寰?/span>d[v]銆?/span>
錛?錛?span> 鍒濆鍖栵細灝嗛櫎婧愮偣澶栫殑鎵鏈夐《鐐圭殑鏈鐭窛紱諱及璁″?/span> d[v] ←+∞, d[s] ←0;
錛?錛?span> 榪唬姹傝В錛氬弽澶嶅杈歸泦E涓殑姣忔潯杈硅繘琛屾澗寮涙搷浣滐紝浣垮緱欏剁偣闆哣涓殑姣忎釜欏剁偣v鐨勬渶鐭窛紱諱及璁″奸愭閫艱繎鍏舵渶鐭窛紱伙紱錛堣繍琛寍v|-1嬈★級
錛?錛?span> 媯楠岃礋鏉冨洖璺細鍒ゆ柇杈歸泦E涓殑姣忎竴鏉¤竟鐨勪袱涓鐐規(guī)槸鍚︽敹鏁涖傚鏋滃瓨鍦ㄦ湭鏀舵暃鐨勯《鐐癸紝鍒欑畻娉曡繑鍥?/span>false錛岃〃鏄庨棶棰樻棤瑙o紱鍚﹀垯綆楁硶榪斿洖true錛屽茍涓斾粠婧愮偣鍙揪鐨勯《鐐?/span>v鐨勬渶鐭窛紱諱繚瀛樺湪 d[v]涓?/span>
綆楁硶鎻忚堪濡備笅錛?/span>
Bellman-Ford(G,w,s) 錛?/span>boolean //鍥?/span>G 錛岃竟闆?/span> 鍑芥暟 w 錛?/span>s涓烘簮鐐?/span>
1 for each vertex v ∈ V錛圙錛?do //鍒濆鍖?span> 1闃舵
2 d[v] ←+∞
3 d[s] ←0; //1闃舵緇撴潫
4 for i=1 to |v|-1 do //2闃舵寮濮嬶紝鍙岄噸寰幆銆?/span>
5 for each edge錛坲,v錛?∈E(G) do //杈歸泦鏁扮粍瑕佺敤鍒幫紝絀蜂婦姣忔潯杈廣?/span>
6 If d[v]> d[u]+ w(u,v) then //鏉懼紱鍒ゆ柇
7 d[v]=d[u]+w(u,v) //鏉懼紱鎿嶄綔 2闃舵緇撴潫
8 for each edge錛坲,v錛?∈E(G) do
9 If d[v]> d[u]+ w(u,v) then
10 Exit false
11 Exit true
涓嬮潰緇欏嚭鎻忚堪鎬ц瘉鏄庯細
棣栧厛鎸囧嚭錛屽浘鐨勪換鎰忎竴鏉℃渶鐭礬寰勬棦涓嶈兘鍖呭惈璐熸潈鍥炶礬錛屼篃涓嶄細鍖呭惈姝f潈鍥炶礬錛屽洜姝ゅ畠鏈澶氬寘鍚?/span>|v|-1鏉¤竟銆?/span>
鍏舵錛屼粠婧愮偣s鍙揪鐨勬墍鏈夐《鐐瑰鏋?/span> 瀛樺湪鏈鐭礬寰勶紝鍒欒繖浜涙渶鐭礬寰勬瀯鎴愪竴涓互s涓烘牴鐨勬渶鐭礬寰勬爲銆?/span>Bellman-Ford綆楁硶鐨勮凱浠f澗寮涙搷浣滐紝瀹為檯涓婂氨鏄寜欏剁偣璺濈s鐨勫眰嬈★紝閫愬眰鐢熸垚榪欐5鏈鐭礬寰勬爲鐨勮繃紼嬨?/span>
鍦ㄥ姣忔潯杈硅繘琛?span>1閬嶆澗寮涚殑鏃跺欙紝鐢熸垚浜嗕粠s鍑哄彂錛屽眰嬈¤嚦澶氫負1鐨勯偅浜涙爲鏋濄備篃灝辨槸璇達紝鎵懼埌浜嗕笌s鑷沖鏈?鏉¤竟鐩歌仈鐨勯偅浜涢《鐐圭殑鏈鐭礬寰勶紱瀵規(guī)瘡鏉¤竟榪涜絎?閬嶆澗寮涚殑鏃跺欙紝鐢熸垚浜嗙2灞傛鐨勬爲鏋濓紝灝辨槸璇存壘鍒頒簡緇忚繃2鏉¤竟鐩歌繛鐨勯偅浜涢《鐐圭殑鏈鐭礬寰?#8230;…銆傚洜涓烘渶鐭礬寰勬渶澶氬彧鍖呭惈|v|-1 鏉¤竟錛屾墍浠ワ紝鍙渶瑕佸驚鐜瘄v|-1 嬈°?/span>
姣忓疄鏂戒竴嬈℃澗寮涙搷浣滐紝鏈鐭礬寰勬爲涓婂氨浼氭湁涓灞傞《鐐硅揪鍒板叾鏈鐭窛紱伙紝姝ゅ悗榪欏眰欏剁偣鐨勬渶鐭窛紱誨煎氨浼氫竴鐩翠繚鎸佷笉鍙橈紝涓嶅啀鍙楀悗緇澗寮涙搷浣滅殑褰卞搷銆傦紙浣嗘槸錛屾瘡嬈¤繕瑕佸垽鏂澗寮涳紝榪欓噷嫻垂浜嗗ぇ閲忕殑鏃墮棿錛屾庝箞浼樺寲錛熷崟綰殑浼樺寲鏄惁鍙錛燂級
濡傛灉娌℃湁璐熸潈鍥炶礬錛岀敱浜庢渶鐭礬寰勬爲鐨勯珮搴︽渶澶氬彧鑳芥槸|v|-1錛屾墍浠ユ渶澶氱粡榪噟v|-1閬嶆澗寮涙搷浣滃悗錛屾墍鏈変粠s鍙揪鐨勯《鐐瑰繀灝嗘眰鍑烘渶鐭窛紱匯傚鏋?d[v]浠嶄繚鎸?+∞錛屽垯琛ㄦ槑浠巗鍒皏涓嶅彲杈俱?/span>
濡傛灉鏈夎礋鏉冨洖璺紝閭d箞絎?span> |v|-1 閬嶆澗寮涙搷浣滀粛鐒朵細鎴愬姛錛岃繖鏃訛紝璐熸潈鍥炶礬涓婄殑欏剁偣涓嶄細鏀舵暃銆?/span>
渚嬪瀵逛簬涓婂浘錛岃竟涓婃柟妗嗕腑鐨勬暟瀛椾唬琛ㄦ潈鍊鹼紝欏剁偣A,B,C涔嬮棿瀛樺湪璐熸潈鍥炶礬銆係鏄簮鐐癸紝欏剁偣涓暟瀛楄〃紺鴻繍琛孊ellman-Ford綆楁硶鍚庡悇鐐圭殑鏈鐭窛紱諱及璁″箋?/span>
姝ゆ椂d[a]鐨勫間負1錛屽ぇ浜巇[c]+w(c,a)鐨勫?2錛岀敱姝[a]鍙互鏉懼紱涓?2錛岀劧鍚巇[b]鍙堝彲浠ユ澗寮涗負-5,d[c]鍙堝彲浠ユ澗寮涗負-7.涓嬩竴涓懆鏈燂紝d[a]鍙堝彲浠ユ洿鏂頒負鏇村皬鐨勫鹼紝榪欎釜榪囩▼姘歌繙涓嶄細緇堟銆傚洜姝わ紝鍦ㄨ凱浠f眰瑙f渶鐭礬寰勯樁孌電粨鏉熷悗錛屽彲浠ラ氳繃媯楠岃竟闆咵鐨勬瘡鏉¤竟(u,v)鏄惁婊¤凍鍏崇郴寮?span> d[v]> d[u]+ w(u,v) 鏉ュ垽鏂槸鍚﹀瓨鍦ㄨ礋鏉冨洖璺?/span>