锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
閫傜敤鏉′歡&鑼冨洿
For i:=1 to |V|-1 do //v涓洪《鐐規(guī)暟 For 姣忔潯杈?u,v)∈E do //瀵規(guī)瘡鏉¤竟榪涜閬嶅巻 Relax(u,v,w); For姣忔潯杈?u,v)∈E do If dis[u]+w<dis[v] Then Exit(False)
綆楁硶鏃墮棿澶嶆潅搴(VE)銆傚洜涓虹畻娉曠畝鍗曪紝閫傜敤鑼冨洿鍙堝箍錛岃櫧鐒跺鏉傚害紼嶉珮錛屼粛涓嶅け涓轟竴涓緢瀹炵敤鐨勭畻娉曘?/p>
綆楁硶鐨勬敼榪?--> SPFA
SPFA(Shortest Path Faster Algorithm)鏄?a title="Bellman-Ford綆楁硶" style="text-decoration: none; color: rgb(90, 54, 150); background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; ">Bellman-Ford綆楁硶鐨勪竴縐?a title="闃熷垪" style="text-decoration: none; color: rgb(0, 43, 184); background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; ">闃熷垪瀹炵幇錛屽噺灝戜簡(jiǎn)涓嶅繀瑕佺殑鍐椾綑璁$畻銆備篃鏈変漢璇碨PFA鏈潵灝辨槸Bellman-Ford綆楁硶錛岀幇鍦ㄥ箍涓烘祦浼犵殑Bellman-Ford綆楁硶瀹為檯涓婃槸灞卞鐗堛?/p>
綆楁硶澶ц嚧嫻佺▼鏄敤涓涓槦鍒楁潵榪涜緇存姢銆?鍒濆鏃跺皢婧愬姞鍏ラ槦鍒椼?姣忔浠庨槦鍒椾腑鍙栧嚭涓涓厓绱狅紝騫跺鎵鏈変笌浠栫浉閭?cè)潥勭偣杩涜?a title="鏉懼紱" style="text-decoration: none; color: rgb(0, 43, 184); background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; ">鏉懼紱錛岃嫢鏌愪釜鐩擱偦鐨勭偣鏉懼紱鎴愬姛錛屽垯灝嗗叾鍏ラ槦銆?鐩村埌闃熷垪涓虹┖鏃剁畻娉曠粨鏉熴?/p>
榪欎釜綆楁硶錛岀畝鍗曠殑璇村氨鏄槦鍒椾紭鍖栫殑bellman-ford,鍒╃敤浜?jiǎn)姣忎釜鐐逛笉浼?xì)鏇存柊嬈℃暟澶鐨勭壒鐐瑰彂鏄庣殑姝ょ畻娉?/p>
SPFA鈥斺擲hortest Path Faster Algorithm錛屽畠鍙互鍦∣(kE)鐨勬椂闂村鏉傚害鍐呮眰鍑烘簮鐐瑰埌鍏朵粬鎵鏈夌偣鐨勬渶鐭礬寰勶紝鍙互澶勭悊璐熻竟銆係PFA鐨勫疄鐜扮敋鑷蟲(chóng)瘮Dijkstra鎴栬匓ellman_Ford榪樿綆鍗曪細(xì)
璁綝ist浠h〃S鍒癐鐐圭殑褰撳墠鏈鐭窛紱伙紝Fa浠h〃S鍒癐鐨勫綋鍓嶆渶鐭礬寰勪腑I鐐逛箣鍓嶇殑涓涓偣鐨勭紪鍙楓傚紑濮嬫椂Dist鍏ㄩ儴涓?∞錛屽彧鏈塂ist[S]=0錛孎a鍏ㄩ儴涓?銆?/p>
緇存姢涓涓槦鍒楋紝閲岄潰瀛樻斁鎵鏈夐渶瑕佽繘琛岃凱浠g殑鐐廣傚垵濮嬫椂闃熷垪涓彧鏈変竴涓偣S銆傜敤涓涓竷?yōu)當(dāng)鏁熬l勮褰曟瘡涓偣鏄惁澶勫湪闃熷垪涓?/p>
姣忔榪唬錛屽彇鍑洪槦澶寸殑鐐箆錛屼緷嬈℃灇涓句粠v鍑哄彂鐨勮竟v->u錛岃杈圭殑闀垮害涓簂en錛屽垽鏂璂ist[v]+len鏄惁灝忎簬Dist[u]錛岃嫢灝忎簬鍒欐敼榪汥ist[u]錛屽皢Fa[u]璁頒負(fù)v錛屽茍涓旂敱浜嶴鍒皍鐨勬渶鐭窛紱誨彉灝忎簡(jiǎn)錛屾湁鍙兘u鍙互鏀硅繘鍏跺畠鐨勭偣錛屾墍浠ヨ嫢u涓嶅湪闃熷垪涓紝灝卞皢瀹冩斁鍏ラ槦灝俱傝繖鏍蜂竴鐩磋凱浠d笅鍘葷洿鍒伴槦鍒楀彉絀猴紝涔熷氨鏄疭鍒版墍鏈夌殑鏈鐭窛紱婚兘紜畾涓嬫潵錛岀粨鏉熺畻娉曘傝嫢涓涓偣鍏ラ槦嬈℃暟瓚呰繃n錛屽垯鏈夎礋鏉冪幆銆?/p>
SPFA 鍦ㄥ艦寮忎笂鍜屽搴︿紭鍏堟悳绱㈤潪甯哥被浼鹼紝涓嶅悓鐨勬槸瀹藉害浼樺厛鎼滅儲(chǔ)涓竴涓偣鍑轟簡(jiǎn)闃熷垪灝變笉鍙兘閲嶆柊榪涘叆闃熷垪錛屼絾鏄疭PFA涓竴涓偣鍙兘鍦ㄥ嚭闃熷垪涔嬪悗鍐嶆琚斁鍏ラ槦鍒楋紝涔熷氨鏄竴涓偣鏀硅繘榪囧叾瀹冪殑鐐逛箣鍚庯紝榪囦簡(jiǎn)涓孌墊椂闂村彲鑳芥湰韜鏀硅繘錛屼簬鏄啀嬈$敤鏉ユ敼榪涘叾瀹冪殑鐐癸紝榪欐牱鍙嶅榪唬涓嬪幓銆傝涓涓偣鐢ㄦ潵浣滀負(fù)榪唬鐐瑰鍏跺畠鐐硅繘琛屾敼榪涚殑騫沖潎嬈℃暟涓簁錛屾湁鍔炴硶璇佹槑瀵逛簬閫氬父鐨勬儏鍐碉紝k鍦?宸﹀彸
Procedure SPFA; Begin initialize-single-source(G,s); initialize-queue(Q); enqueue(Q,s); while not empty(Q) do begin u:=dequeue(Q); for each v∈adj[u] do begin tmp:=d[v]; relax(u,v); if (tmp<>d[v]) and (not v in Q) then enqueue(Q,v); end; end; End;
procedure spfa; begin fillchar(q,sizeof(q),0); h:=0; t:=0;//闃熷垪 fillchar(v,sizeof(v),false);//v[i]鍒ゆ柇i鏄惁鍦ㄩ槦鍒椾腑 for i:=1 to n do dist[i]:=maxint;//鍒濆鍖栨渶灝忓?/span> inc(t); q[t]:=1; v[1]:=true; dist[1]:=0;//榪欓噷鎶?浣滀負(fù)婧愮偣 while h<>t do begin h:=(h mod n)+1; x:=q[h]; v[x]:=false; for i:=1 to n do if (cost[x,i]>0) and (dist[x]+cost[x,i]<dist[i]) then begin dist[i]:=dist[x]+cost[x,i]; if not(v[i]) then begin t:=(t mod n)+1; q[t]:=i; v[i]:=true; end; end; end; end;
void SPFA(void)//濂戒箙浠ュ墠鍐欑殑……浠婂ぉ涓笂鏉?#8230;…璇濊鎴戦兘涓嶈寰桽PFA鎬庝箞鍐欎簡(jiǎn)……鍥?#8230;…ms瀛樺浘鏄煩闃?#8230;…鍡棷 { int i; queue list; list.insert(s); for(i=1;i<=n;i++) { if(s==i) continue; dist[i]=map[s][i]; way[i]=s; if(dist[i]) list.insert(i); } int p; while(!list.empty()) { p=list.fire(); for(i=1;i<=n;i++) if(map[p][i]&&(dist[i]>dist[p]+map[p][i]||!dist[i])&&i!=s) { dist[i]=dist[p]+map[p][i]; way[i]=p; if(!list.in(i)) list.insert(i); } } }
棰樼洰鍦板潃:
http://poj.org/problem?id=1258
棰樼洰鎻忚堪:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 16557 | Accepted: 6745 |
Description
Input
Output
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
棰樼洰鍒嗘瀽 :
MST 姘撮, 鐢↘RUSKARL 鎴?PRIM 杞繪澗鑳借繃.
浠g爜濡備笅 :
/* Mail to : miyubai@gamil.com MyBlog : http://baiyun.me Link : http://www.cnblogs.com/MiYu || http://www.shnenglu.com/MiYu Author By : MiYu Test : 1 Complier : g++ mingw32-3.4.2 Program : Agri-Net Doc Name : PKU_1258 */ //#pragma warning( disable:4789 ) #include <iostream> #include <fstream> #include <sstream> #include <algorithm> #include <string> #include <set> #include <map> #include <utility> #include <queue> #include <stack> #include <list> #include <vector> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> using namespace std; const int MAX = 105; int st[105]; int N, x, y, w; struct vv { int x, y, val; void set ( int a, int b, int w ) { x=a,y=b,val=w; } }v[10005]; bool cmp ( const vv &a, const vv &b ) { return a.val < b.val; } void creat () { for ( int i = 0; i <= N; ++ i ) st[i] = i; } int find ( int x ) { return x != st[x] ? find ( st[x] ) : x; } void merge ( int x, int y ) { x = find ( x ); y = find ( y ); if ( x == y ) return; st[y] = x; } int main () { while ( scanf ( "%d", &N )==1) { creat (); memset ( v, 0, sizeof ( v ) ); int c = 0; for ( int i = 1; i <= N; ++ i ) { for ( int j = 1; j <= N; ++ j ) { scanf ( "%d", &w ); v[c++].set ( i,j,w ); } } sort ( v, v + c, cmp ); int sum = 0; for ( int i = 0 ; i < c; ++ i ) { if ( find ( v[i].x ) != find ( v[i].y ) ) { sum += v[i].val; merge ( v[i].x, v[i].y ); } } printf ( "%d\n", sum ); } return 0; }
娉ㄦ剰涓嬬6琛岃繖涓湴鏂癸紝濡傛灉dist[i][k]鎴栬卍ist[k][j]涓嶅瓨鍦紝紼嬪簭涓敤涓涓緢澶х殑鏁頒唬鏇褲傛渶濂藉啓鎴恑f(dist[i][k]!=INF && dist[k][j]!=INF && dist[i][k]+dist[k][j]<dist[i][j])錛屼粠鑰岄槻姝㈡孩鍑烘墍閫犳垚鐨勯敊璇?br> 涓婇潰榪欎釜褰㈠紡鐨勭畻娉曞叾瀹炴槸Floyd綆楁硶鐨勭簿綆鐗堬紝鑰岀湡姝g殑Floyd綆楁硶鏄竴縐嶅熀浜嶥P(Dynamic Programming)鐨勬渶鐭礬寰勭畻娉曘?br> 璁懼浘G涓璶 涓《鐐圭殑緙栧彿涓?鍒皀銆備護(hù)c [i, j, k]琛ㄧず浠巌 鍒癹 鐨勬渶鐭礬寰勭殑闀垮害錛屽叾涓璳 琛ㄧず璇ヨ礬寰勪腑鐨勬渶澶ч《鐐癸紝涔熷氨鏄c[i,j,k]榪欐潯鏈鐭礬寰勬墍閫氳繃鐨勪腑闂撮《鐐規(guī)渶澶т笉瓚呰繃k銆傚洜姝わ紝濡傛灉G涓寘鍚竟<i, j>錛屽垯c[i, j, 0] =杈?lt;i, j> 鐨勯暱搴︼紱鑻= j 錛屽垯c[i,j,0]=0錛涘鏋淕涓笉鍖呭惈杈?lt;i, j>錛屽垯c (i, j, 0)= +∞銆俢[i, j, n] 鍒欐槸浠巌 鍒癹 鐨勬渶鐭礬寰勭殑闀垮害銆?br> 瀵逛簬浠繪剰鐨刱>0錛岄氳繃鍒嗘瀽鍙互寰楀埌錛氫腑闂撮《鐐逛笉瓚呰繃k 鐨刬 鍒癹 鐨勬渶鐭礬寰勬湁涓ょ鍙兘錛氳璺緞鍚垨涓嶅惈涓棿欏剁偣k銆傝嫢涓嶅惈錛屽垯璇ヨ礬寰勯暱搴﹀簲涓篶[i, j, k-1]錛屽惁鍒欓暱搴︿負(fù) c[i, k, k-1] +c [k, j, k-1]銆俢[i, j, k]鍙彇涓よ呬腑鐨勬渶灝忓箋?br> 鐘舵佽漿縐繪柟紼嬶細(xì)c[i, j, k]=min{c[i, j, k-1], c [i, k, k-1]+c [k, j, k-1]}錛宬錛?銆?br> 榪欐牱錛岄棶棰樹(shù)究鍏鋒湁浜?jiǎn)鏈浼樺瓙緇撴瀯鎬ц川錛屽彲浠ョ敤鍔ㄦ佽鍒掓柟娉曟潵姹傝В銆?/p>
杈撳叆 1 3
杈撳嚭 +∞
+∞
+∞
+∞
28
10
10
10
9
9
9
Floyd-Warshall綆楁硶涓嶄粎鑳芥眰鍑轟換鎰?鐐歸棿鐨勬渶鐭礬寰勶紝榪樺彲浠ヤ繚瀛樻渶鐭礬寰勪笂緇忚繃鐨勮妭鐐廣備笅闈㈢敤綺劇畝鐗堢殑Floyd綆楁硶瀹炵幇榪欎竴榪囩▼錛岀▼搴忎腑鐨勫浘渚濈劧瀵瑰簲涓婇潰鐨勬湁鍚戝浘銆?br>
杈撳叆 1 3
杈撳嚭 1 2 5 8 6 3