锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 銆銆5) 鏍囪鐐筰銆傚鏋滄墍鏈夌偣宸叉爣璁幫紝鍒欑畻娉曞畬鍏ㄦ帹鍑猴紝鍚﹀垯錛岃k=i錛岃漿鍒?) 鍐嶇戶緇?/p>
銆銆5) 鏍囪鐐筰銆傚鏋滄墍鏈夌偣宸叉爣璁幫紝鍒欑畻娉曞畬鍏ㄦ帹鍑猴紝鍚﹀垯錛岃k=i錛岃漿鍒?) 鍐嶇戶緇?/p>
銆銆5) 鏍囪鐐筰銆傚鏋滄墍鏈夌偣宸叉爣璁幫紝鍒欑畻娉曞畬鍏ㄦ帹鍑猴紝鍚﹀垯錛岃k=i錛岃漿鍒?) 鍐嶇戶緇?/p>
棰樼洰鍦板潃:
http://acm.hdu.edu.cn/showproblem.php?pid=1548
棰樼洰鎻忚堪:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2641 Accepted Submission(s): 944
Problem Description
There is a strange lift.The lift can stop can at every floor as you want, and there is a number Ki(0 <= Ki <= N) on every floor.The lift have just two buttons: up and down.When you at floor i,if you press the button "UP" , you will go up Ki floor,i.e,you will go to the i+Ki th floor,as the same, if you press the button "DOWN" , you will go down Ki floor,i.e,you will go to the i-Ki th floor. Of course, the lift can't go up high than N,and can't go down lower than 1. For example, there is a buliding with 5 floors, and k1 = 3, k2 = 3,k3 = 1,k4 = 2, k5 = 5.Begining from the 1 st floor,you can press the button "UP", and you'll go up to the 4 th floor,and if you press the button "DOWN", the lift can't do it, because it can't go down to the -2 th floor,as you know ,the -2 th floor isn't exist.
Here comes the problem: when you is on floor A,and you want to go to floor B,how many times at least he havt to press the button "UP" or "DOWN"?
Input
The input consists of several test cases.,Each test case contains two lines.
The first line contains three integers N ,A,B( 1 <= N,A,B <= 200) which describe above,The second line consist N integers k1,k2,
.kn.
A single 0 indicate the end of the input.
Output
For each case of the input output a interger, the least times you have to press the button when you on floor A,and you want to go to floor B.If you can't reach floor B,printf "-1".
Sample Input
5 1 5
3 3 1 2 5
0
Sample Output
3
棰樼洰鍒嗘瀽:
鍒氬紑濮嬪仛鐨勬椂鍊欒嚜宸辨兂澶嶆潅浜? 浠ヤ負浠庝笉鍚岀殑妤煎眰寮濮? 灝辨湁涓嶅悓鐨勮蛋娉? 鎵浠ュ紑濮嬬殑鏃跺欏啓寰幆娌″啓瀵?
灝卞啓鎴愪簡閫掑綊. 緇撴灉寰堟澂鍏風殑 STACK_OVERFLOW........ 鍦?AMB 紲炵墰鐨勬寚鐐瑰彂鐜? 鍘熸潵鏄嚜宸辨兂澶嶆潅浜?
鍙渶瑕佽綆楀嚭姣忎竴涓ゼ灞傜殑 涓婃ゼ 鍜?涓嬫ゼ灝卞彲浠ヤ簡, 褰撶劧, 瑕佹敞鎰忔槸鍚﹁秺鐣? 鍥劇敓鎴愬悗, 褰撶劧灝辨槸 DIJKSTRA浜?
闂叉潵鏃犱簨, 鍙堝鍒朵竴閬?:
Dijkstra綆楁硶鐨勫熀鏈濊礬鏄細
鍋囪姣忎釜鐐歸兘鏈変竴瀵規(guī)爣鍙?(dj, pj)錛屽叾涓璬j鏄粠璧鋒簮鐐箂鍒扮偣j鐨勬渶鐭礬寰勭殑闀垮害 (浠庨《鐐瑰埌鍏舵湰韜殑鏈鐭礬寰勬槸闆惰礬(娌℃湁寮х殑璺?錛屽叾闀垮害絳変簬闆?錛?br>
pj鍒欐槸浠巗鍒癹鐨勬渶鐭礬寰勪腑j鐐圭殑鍓嶄竴鐐廣傛眰瑙d粠璧鋒簮鐐箂鍒扮偣j鐨勬渶鐭礬寰勭畻娉曠殑鍩烘湰榪囩▼濡備笅錛?br>
銆銆1) 鍒濆鍖栥傝搗婧愮偣璁劇疆涓猴細鈶?ds=0, ps涓虹┖;鈶?鎵鏈夊叾浠栫偣: di=∞, pi=?;鈶?鏍囪璧鋒簮鐐箂錛岃k=s,鍏朵粬鎵鏈夌偣璁句負鏈爣璁扮殑銆?br>
銆銆2) 媯楠屼粠鎵鏈夊凡鏍囪鐨勭偣k鍒板叾鐩存帴榪炴帴鐨勬湭鏍囪鐨勭偣j鐨勮窛紱伙紝騫惰緗細
dj=min錛籨j, dk+lkj錛?br>
寮忎腑錛宭kj鏄粠鐐筴鍒癹鐨勭洿鎺ヨ繛鎺ヨ窛紱匯?br>
銆銆3) 閫夊彇涓嬩竴涓偣銆備粠鎵鏈夋湭鏍囪鐨勭粨鐐逛腑錛岄夊彇dj 涓渶灝忕殑涓涓猧錛?br>
di=min錛籨j, 鎵鏈夋湭鏍囪鐨勭偣j錛?br>
鐐筰灝辮閫変負鏈鐭礬寰勪腑鐨勪竴鐐癸紝騫惰涓哄凡鏍囪鐨勩?br>
銆銆4) 鎵懼埌鐐筰鐨勫墠涓鐐廣備粠宸叉爣璁扮殑鐐逛腑鎵懼埌鐩存帴榪炴帴鍒扮偣i鐨勭偣j*錛屼綔涓哄墠涓鐐?璁劇疆錛歩=j*
浠g爜濡備笅:
using namespace std;
const int MAX = 200;
const int INF = 0x7FFFFFF;
int N,A,B;
int g[MAX+1][MAX+1];
int hash[MAX+1];
int path[MAX+1];
int K[MAX+1];
int Dijkstra ( int beg , int end )
{
path[beg] = 0;
hash[beg] = false;
while ( beg != end )
{
int m = INF, temp;
for ( int i = 1; i <= N; ++ i )
{
if ( g[beg][i] != INF )
path[i] = min ( path[i], path[beg] + g[beg][i] );
if ( m > path[i] && hash[i] )
{
m = path[i];
temp = i;
}
}
beg = temp;
if ( m == INF )
break;
hash[beg] = false;
}
if ( path[end] == INF )
return -1;
return path[end];
}
int main ()
{
while ( scanf ( "%d%d%d", &N, &A, &B ) , N )
{
for ( int i = 0; i <= MAX; ++ i )
{
hash[i] = true;
path[i] = INF;
for ( int j = 0; j <= MAX; ++ j )
{
g[i][j] = INF;
}
}
for ( int i = 1; i <= N; ++ i )
{
scanf ( "%d",&K[i] );
}
for ( int i = 1; i <= N; ++ i )
{
if ( i + K[i] <= N )
g[ i ][ i + K[i] ] = 1;
if ( i - K[i] >= 1 )
g[ i ][ i - K[i] ] = 1;
}
cout << Dijkstra ( A, B ) << endl;
}
return 0;
}
SO 浠g爜:
using namespace std;
const int MAX = 200;
const int INF = 0x7FFFFFF;
bool UP = true;
bool DOWN = false;
int N,A,B;
int g[MAX+1][MAX+1];
int hash[MAX+1];
int path[MAX+1];
int K[MAX+1];
int Dijkstra ( int beg , int end )
{
path[beg] = 0;
hash[beg] = false;
while ( beg != end )
{
int m = INF, temp;
for ( int i = 1; i <= N; ++ i )
{
if ( g[beg][i] != INF )
path[i] = min ( path[i], path[beg] + g[beg][i] );
if ( m > path[i] && hash[i] )
{
m = path[i];
temp = i;
}
}
beg = temp;
if ( m == INF )
break;
hash[beg] = false;
}
if ( path[end] == INF )
return -1;
return path[end];
}
bool setGraph ( int n, bool flag )
{
if ( flag )
{
if ( n + K[n] <= N )
{
g[ n ][ n + K[n] ] = 1;
setGraph ( n + K[n], UP );
setGraph ( n + K[n], DOWN );
}
}
else
{
if ( n - K[n] >= 1 )
{
g[ n ][ n - K[n] ] = 1;
setGraph ( n - K[n], UP );
setGraph ( n - K[n], DOWN );
}
}
return true;
}
int main ()
{
while ( scanf ( "%d%d%d", &N, &A, &B ) , N )
{
for ( int i = 0; i <= MAX; ++ i )
{
hash[i] = true;
path[i] = INF;
for ( int j = 0; j <= MAX; ++ j )
{
g[i][j] = INF;
}
}
for ( int i = 1; i <= N; ++ i )
{
scanf ( "%d",&K[i] );
}
for ( int i = 1; i <= N; ++ i )
{
setGraph ( i, UP );
setGraph ( i, DOWN );
}
cout << Dijkstra ( A, B ) << endl;
}
return 0;
}
]]>
棰樼洰鍦板潃:
http://acm.hdu.edu.cn/showproblem.php?pid=1874
棰樼洰鎻忚堪:
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5528 Accepted Submission(s): 1686
Problem Description
鏌愮渷鑷粠瀹炶浜嗗緢澶氬勾鐨勭晠閫氬伐紼嬭鍒掑悗錛岀粓浜庝慨寤轟簡寰堝璺備笉榪囪礬澶氫簡涔熶笉濂斤紝姣忔瑕佷粠涓涓煄闀囧埌鍙︿竴涓煄闀囨椂錛岄兘鏈夎澶氱閬撹礬鏂規(guī)鍙互閫夋嫨錛岃屾煇浜涙柟妗堣姣斿彟涓浜涙柟妗堣璧扮殑璺濈瑕佺煭寰堝銆傝繖璁╄浜哄緢鍥版壈銆?br>
鐜板湪錛屽凡鐭ヨ搗鐐瑰拰緇堢偣錛岃浣犺綆楀嚭瑕佷粠璧風偣鍒扮粓鐐癸紝鏈鐭渶瑕佽璧板灝戣窛紱匯?br>
Input
鏈鐩寘鍚緇勬暟鎹紝璇峰鐞嗗埌鏂囦歡緇撴潫銆?br>姣忕粍鏁版嵁絎竴琛屽寘鍚袱涓鏁存暟N鍜孧(0<N<200,0<M<1000)錛屽垎鍒唬琛ㄧ幇鏈夊煄闀囩殑鏁扮洰鍜屽凡淇緩鐨勯亾璺殑鏁扮洰銆傚煄闀囧垎鍒互0锝濶-1緙栧彿銆?br>鎺ヤ笅鏉ユ槸M琛岄亾璺俊鎭傛瘡涓琛屾湁涓変釜鏁存暟A,B,X(0<A,B<N,A!=B,0<X<10000),琛ㄧず鍩庨晣A鍜屽煄闀嘊涔嬮棿鏈変竴鏉¢暱搴︿負X鐨勫弻鍚戦亾璺?br>鍐嶆帴涓嬩竴琛屾湁涓や釜鏁存暟S,T(0<=S,T<N)錛屽垎鍒唬琛ㄨ搗鐐瑰拰緇堢偣銆?br>
Output
瀵逛簬姣忕粍鏁版嵁錛岃鍦ㄤ竴琛岄噷杈撳嚭鏈鐭渶瑕佽璧扮殑璺濈銆傚鏋滀笉瀛樺湪浠嶴鍒癟鐨勮礬綰匡紝灝辮緭鍑?/span>-1.
Sample Input
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2
Sample Output
2
-1
棰樼洰鍒嗘瀽:
Dijkstra綆楁硶鐨勫熀鏈濊礬鏄細
鍋囪姣忎釜鐐歸兘鏈変竴瀵規(guī)爣鍙?(dj, pj)錛屽叾涓璬j鏄粠璧鋒簮鐐箂鍒扮偣j鐨勬渶鐭礬寰勭殑闀垮害 (浠庨《鐐瑰埌鍏舵湰韜殑鏈鐭礬寰勬槸闆惰礬(娌℃湁寮х殑璺?錛屽叾闀垮害絳変簬闆?錛?br>
pj鍒欐槸浠巗鍒癹鐨勬渶鐭礬寰勪腑j鐐圭殑鍓嶄竴鐐廣傛眰瑙d粠璧鋒簮鐐箂鍒扮偣j鐨勬渶鐭礬寰勭畻娉曠殑鍩烘湰榪囩▼濡備笅錛?br>
銆銆1) 鍒濆鍖栥傝搗婧愮偣璁劇疆涓猴細鈶?ds=0, ps涓虹┖;鈶?鎵鏈夊叾浠栫偣: di=∞, pi=?;鈶?鏍囪璧鋒簮鐐箂錛岃k=s,鍏朵粬鎵鏈夌偣璁句負鏈爣璁扮殑銆?br>
銆銆2) 媯楠屼粠鎵鏈夊凡鏍囪鐨勭偣k鍒板叾鐩存帴榪炴帴鐨勬湭鏍囪鐨勭偣j鐨勮窛紱伙紝騫惰緗細
dj=min錛籨j, dk+lkj錛?br>
寮忎腑錛宭kj鏄粠鐐筴鍒癹鐨勭洿鎺ヨ繛鎺ヨ窛紱匯?br>
銆銆3) 閫夊彇涓嬩竴涓偣銆備粠鎵鏈夋湭鏍囪鐨勭粨鐐逛腑錛岄夊彇dj 涓渶灝忕殑涓涓猧錛?br>
di=min錛籨j, 鎵鏈夋湭鏍囪鐨勭偣j錛?br>
鐐筰灝辮閫変負鏈鐭礬寰勪腑鐨勪竴鐐癸紝騫惰涓哄凡鏍囪鐨勩?br>
銆銆4) 鎵懼埌鐐筰鐨勫墠涓鐐廣備粠宸叉爣璁扮殑鐐逛腑鎵懼埌鐩存帴榪炴帴鍒扮偣i鐨勭偣j*錛屼綔涓哄墠涓鐐?璁劇疆錛歩=j*
浠g爜濡備笅:
using namespace std;
const int MAX = 201;
const int INF = 0x7FFFFFF;
int graph[MAX][MAX];
bool hash[MAX];
int path[MAX];
int N,M;
int Dijkstra ( int beg , int end )
{
path[beg] = 0;
hash[beg] = false;
while ( beg != end )
{
int m = INF, temp;
for ( int i = 0; i != N; ++ i )
{
if ( graph[beg][i] != INF )
path[i] = min ( path[i], path[beg] + graph[beg][i] );
if ( m > path[i] && hash[i] )
{
m = path[i];
temp = i;
}
}
beg = temp;
if ( m == INF )
break;
hash[beg] = false;
}
if ( path[end] == INF )
return -1;
return path[end];
}
int main ()
{
while ( scanf ( "%d%d", &N, &M ) != EOF )
{
for ( int i = 0; i != MAX; ++ i )
{
hash[i] = true;
path[i] = INF;
for ( int j = 0; j != MAX; ++ j )
{
graph[i][j] = INF;
}
}
for ( int i = 0; i != M; ++ i )
{
int c1,c2,cost;
scanf ( "%d%d%d",&c1, &c2, &cost );
if ( cost < graph[c1][c2] )
graph[c1][c2] = graph[c2][c1] = cost;
}
int beg,end;
scanf ( "%d%d",&beg, &end );
cout << Dijkstra ( beg,end ) << endl;
}
return 0;
}
]]>
棰樼洰鍦板潃:
http://acm.hdu.edu.cn/showproblem.php?pid=2066
棰樼洰鎻忚堪:
Total Submission(s): 4077 Accepted Submission(s): 1348
Problem Description
铏界劧鑽夊効鏄釜璺棿錛堝氨鏄湪鏉數寰呬簡涓騫村錛屽眳鐒惰繕浼氬湪鏍″洯閲岃糠璺殑浜猴紝姹?/span>~),浣嗘槸鑽夊効浠嶇劧寰堝枩嬈㈡梾琛岋紝鍥犱負鍦ㄦ梾閫斾腑 浼氶亣瑙佸緢澶氫漢錛堢櫧椹帇瀛愶紝^0^錛夛紝寰堝浜嬶紝榪樿兘涓板瘜鑷繁鐨勯槄鍘嗭紝榪樺彲浠ョ湅緹庝附鐨勯鏅?#8230;…鑽夊効鎯沖幓寰堝鍦版柟錛屽ス鎯寵鍘諱笢浜搧濉旂湅澶滄櫙錛屽幓濞佸凹鏂湅鐢靛獎錛屽幓闃蟲槑灞變笂鐪嬫搗鑺嬶紝鍘葷航綰︾函綺圭湅闆櫙錛屽幓宸撮粠鍠濆挅鍟″啓淇★紝鍘誨寳浜帰鏈涘瓱濮滃コ……鐪肩湅瀵掑亣灝卞揩鍒頒簡錛岃繖涔堜竴澶ф鏃墮棿錛屽彲涓嶈兘嫻垂鍟婏紝涓瀹氳緇欒嚜宸卞ソ濂界殑鏀句釜鍋囷紝鍙槸涔熶笉鑳借崚搴熶簡璁粌鍟婏紝鎵浠ヨ崏鍎垮喅瀹氬湪瑕佸湪鏈鐭殑鏃墮棿鍘諱竴涓嚜宸辨兂鍘葷殑鍦版柟錛佸洜涓鴻崏鍎跨殑瀹跺湪涓涓皬闀囦笂錛屾病鏈夌伀杞︾粡榪囷紝鎵浠ュス鍙兘鍘婚偦榪戠殑鍩庡競鍧愮伀杞︼紙濂藉彲鎬滃晩~錛夈?br>
Input
杈撳叆鏁版嵁鏈夊緇勶紝姣忕粍鐨勭涓琛屾槸涓変釜鏁存暟T錛孲鍜孌錛岃〃紺烘湁T鏉¤礬錛屽拰鑽夊効瀹剁浉閭葷殑鍩庡競鐨勬湁S涓紝鑽夊効鎯沖幓鐨勫湴鏂規(guī)湁D涓紱
鎺ョ潃鏈塗琛岋紝姣忚鏈変笁涓暣鏁癮錛宐錛宼ime,琛ㄧずa,b鍩庡競涔嬮棿鐨勮濺紼嬫槸time灝忔椂錛?1=<(a,b)<=1000;a,b 涔嬮棿鍙兘鏈夊鏉¤礬)
鎺ョ潃鐨勭T+1琛屾湁S涓暟錛岃〃紺哄拰鑽夊効瀹剁浉榪炵殑鍩庡競錛?br>鎺ョ潃鐨勭T+2琛屾湁D涓暟錛岃〃紺鴻崏鍎挎兂鍘誨湴鏂廣?br>
Output
杈撳嚭鑽夊効鑳藉幓鏌愪釜鍠滄鐨勫煄甯傜殑鏈鐭椂闂淬?br>
Sample Input
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
Sample Output
9
棰樼洰鍒嗘瀽:
榪樻槸鑷繁娌℃湁鎶奃IJKSTRA 綆楁硶鐞嗚В濂?... 鍐嶆鐪嬩簡涓閬嶇畻娉曠殑鎻忚堪鍜屾暟鎹粨鏋勪功涓婄殑 sample鍚?鍙戠幇, 鍏跺疄綆楁硶鎵ц榪囩▼涓?br>宸茬粡鎶婅搗鐐瑰埌鍏朵粬鐐圭殑鏈鐭窛紱誨叏閮ㄧ畻鍑烘潵浜? 鎵浠ュ彧闇瑕?鏋氫婦姣忎釜璧風偣灝卞彲浠ヤ簡, 鍏村涔嬩笅, 椹笂淇敼浜嗕唬鐮? Submit! ......
寰?鏉叿, 榪樻槸tle ...... 涓嶆槑鐧戒負浠涔?....鐪嬬綉涓婂叾浠栦漢鍐欑殑 瑙i鎶ュ憡 , 鍘熸潵寰堝浜轟篃鏄繖鍋氱殑, 鏋氫婦璧峰鐐? 浣嗘槸浠栦滑鐨勫嵈鍙互AC.
铏界劧鏃墮棿涓鑸槸 100MS宸﹀彸. 榪欓噷鎴戜竴鐩村緢綰犵粨, 涓嶆槑鐧藉悓鏍風殑綆楁硶涓轟粈涔堟垜鐨勪細TLE.
鍦?AMB 澶х墰鐨勬彁紺轟笅, 涓嶉渶瑕佸叏閮ㄦ灇涓? 鍙鎶婃墍鏈夎搗鐐圭殑璺濈閮借緗垚0灝卞彲浠ヤ簡, 浣嗘槸涓嶇煡閬撲負浠涔? 榪樻槸涓鐩碩LE.
鏈鍚庣殑鍔炴硶鏄? 璁劇疆涓涓搗鐐規(guī)寚鍚戞墍鏈夎搗鐐? 涔嬮棿鐨勮窛紱昏緗負 1, 鍚屾牱 璁劇疆涓涓粓鐐規(guī)寚鍚戞墍鏈夌粓鐐? 璺濈鍚屾牱璁劇疆涓?, 鏈鍚?br>浣跨敤 DIJKSTRA 綆楁硶 姹傚嚭璧風偣鍒扮粓鐐圭殑鏈鐭窛紱?- 2 灝辮浜?
浠g爜濡備笅:
using namespace std;
const int INF = 0x7FFFFFFF;
int T,S,D,L;
const int MAXN=1005; //鐐逛釜鏁?/span>
int graph[MAXN][MAXN];
int s[MAXN];
int d[MAXN];
int Dijkstra ( int beg, int end )
{
bool hash[MAXN];
int path[MAXN];
for ( int i = 0; i <= L; ++ i )
{
hash[i] = true;
path[i] = INF;
}
hash[beg] = false;
path[beg] = 0;
while ( beg != end )
{
for ( int i = 0; i <= L; ++ i )
{
if ( graph[beg][i] != 0 )
{
if ( path[i] > path[beg] + graph[beg][i] )
path[i] = path[beg] + graph[beg][i];
}
}
int min = INF;
for ( int i = 0; i <= L; ++ i )
{
if ( min > path[i] && hash[i] )
{
min = path[i];
beg = i;
}
}
hash[beg] = false;
}
return path[end];
}
int main ()
{
while ( scanf ( "%d%d%d",&T,&S,&D ) != EOF )
{
memset ( graph , 0 , sizeof ( graph ) );
L = 0;
for ( int i = 1; i <= T; ++ i )
{
int r,c,cost;
scanf ( "%d%d%d",&r,&c,&cost );
if ( graph[r][c] == 0 )
graph[r][c] = graph[c][r] = cost ;
else
{
if ( cost < graph[r][c] )
graph[r][c] = graph[c][r] = cost ;
}
if ( L < max ( r,c ) )
L = max ( r,c );
}
for ( int i = 0; i != S; ++ i )
{
scanf ( "%d",&s[i] );
graph[0][ s[i] ] = 1;
graph[ s[i] ][0] = 1;
}
L ++;
for ( int i = 0; i != D; ++ i )
{
scanf ( "%d",&d[i] );
graph[ d[i] ][ L ] = 1;
graph[ L ][ d[i] ] = 1;
}
cout << Dijkstra ( 0,L ) - 2 << endl;
}
return 0;
}
欏轟究 0rz 涓嬪ぇ鐗?浠g爜:
#define MAX 1005
#define INF 0x7FFF
#define CMP(A,B) (A.d < B.d)
using namespace std;
int d[MAX][MAX];
class HNode {
public:
int v;
int d;
};
class Heap {
public:
HNode h[MAX * 2];
int n, p, c;
Heap() {
n = 0;
}
void inline ins(HNode e) {
for (p = ++n; p > 1 && CMP(e,h[p>>1]); h[p] = h[p>>1], p >>= 1)
;
h[p] = e;
}
int inline pop(HNode &e) {
if (!n)
return 0;
for (e = h[p = 1], c = 2; c < n
&& CMP(h[c += (CMP(h[c + 1],h[c]) && c < n - 1)], h[n]);
h[p] = h[c], p = c, c <<= 1)
;
h[p] = h[n--];
return 1;
}
};
int Dijkstra(int A, int B, int N) {
int dist[MAX];
int mask[MAX];
int Tmp;
Heap h;
HNode e, ne;
for (int i = 0; i < N; i++) {
dist[i] = INF;
mask[i] = 0;
}
dist[e.v = A] = (e.d = 0);
h.ins(e);
while (h.pop(e)) {
if (!mask[e.v]) {
mask[e.v] = 1;
for (int i = 0; i < N; i++) {
if (!mask[i] && (Tmp = e.d + d[e.v][i])
< dist[i]) {
dist[ne.v = i] = (ne.d = Tmp);
h.ins(ne);
}
}
}
}
return dist[B];
}
int main() {
int T, S, D, M;
int st, en, tm;
while (scanf("%d %d %d", &T, &S, &D)!=EOF) {
M = 0;
for (int i = 0; i < MAX; i++)
for (int j = 0; j < MAX; j++)
d[i][j] = INF;
for (int i = 0; i < T; i++) {
scanf("%d %d %d", &st, &en, &tm);
if (tm < d[st][en]) {
d[st][en] = d[en][st] = tm;
}
M = st> M ? st : M;
M = en> M ? en : M;
}
M = M + 1;
for (int i = 0; i < S; i++) {
scanf("%d", &st);
d[0][st] = 1;
d[st][0] = 1;
}
for (int i = 0; i < D; i++) {
scanf("%d", &en);
d[M][en] = 1;
d[en][M] = 1;
}
cout<<Dijkstra(0, M, M+1)-2<<endl;
}
return 0;
}
]]>
棰樼洰鍦板潃:
http://acm.hdu.edu.cn/showproblem.php?pid=2544
棰樼洰鎻忚堪:
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3844 Accepted Submission(s): 1628
Problem Description
鍦ㄦ瘡騫寸殑鏍¤禌閲岋紝鎵鏈夎繘鍏ュ喅璧涚殑鍚屽閮戒細鑾峰緱涓浠跺緢婕備寒鐨則-shirt銆備絾鏄瘡褰撴垜浠殑宸ヤ綔浜哄憳鎶婁笂鐧句歡鐨勮。鏈嶄粠鍟嗗簵榪愬洖鍒拌禌鍦虹殑鏃跺欙紝鍗存槸闈炲父绱殑錛佹墍浠ョ幇鍦ㄤ粬浠兂瑕佸鎵炬渶鐭殑浠庡晢搴楀埌璧涘満鐨勮礬綰匡紝浣犲彲浠ュ府鍔╀粬浠悧錛?br>
Input
杈撳叆鍖呮嫭澶氱粍鏁版嵁銆傛瘡緇勬暟鎹涓琛屾槸涓や釜鏁存暟N銆丮錛圢<=100錛孧<=10000錛夛紝N琛ㄧず鎴愰兘鐨勫ぇ琛椾笂鏈夊嚑涓礬鍙o紝鏍囧彿涓?鐨勮礬鍙f槸鍟嗗簵鎵鍦ㄥ湴錛屾爣鍙蜂負N鐨勮礬鍙f槸璧涘満鎵鍦ㄥ湴錛孧鍒欒〃紺哄湪鎴愰兘鏈夊嚑鏉¤礬銆侼=M=0琛ㄧず杈撳叆緇撴潫銆傛帴涓嬫潵M琛岋紝姣忚鍖呮嫭3涓暣鏁癆錛孊錛孋錛?/span>1<=A,B<=N,1<=C<=1000錛?琛ㄧず鍦ㄨ礬鍙涓庤礬鍙涔嬮棿鏈変竴鏉¤礬錛屾垜浠殑宸ヤ綔浜哄憳闇瑕丆鍒嗛挓鐨勬椂闂磋蛋榪囪繖鏉¤礬銆?br>杈撳叆淇濊瘉鑷沖皯瀛樺湪1鏉″晢搴楀埌璧涘満鐨勮礬綰褲?br>
Output
瀵逛簬姣忕粍杈撳叆錛岃緭鍑轟竴琛岋紝琛ㄧず宸ヤ綔浜哄憳浠庡晢搴楄蛋鍒拌禌鍦虹殑鏈鐭椂闂?br>
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
棰樼洰鍒嗘瀽:
Dijkstra綆楁硶鐨勫熀鏈濊礬鏄細
鍋囪姣忎釜鐐歸兘鏈変竴瀵規(guī)爣鍙?(dj, pj)錛屽叾涓璬j鏄粠璧鋒簮鐐箂鍒扮偣j鐨勬渶鐭礬寰勭殑闀垮害 (浠庨《鐐瑰埌鍏舵湰韜殑鏈鐭礬寰勬槸闆惰礬(娌℃湁寮х殑璺?錛屽叾闀垮害絳変簬闆?錛?br>
pj鍒欐槸浠巗鍒癹鐨勬渶鐭礬寰勪腑j鐐圭殑鍓嶄竴鐐廣傛眰瑙d粠璧鋒簮鐐箂鍒扮偣j鐨勬渶鐭礬寰勭畻娉曠殑鍩烘湰榪囩▼濡備笅錛?br>
銆銆1) 鍒濆鍖栥傝搗婧愮偣璁劇疆涓猴細鈶?ds=0, ps涓虹┖;鈶?鎵鏈夊叾浠栫偣: di=∞, pi=?;鈶?鏍囪璧鋒簮鐐箂錛岃k=s,鍏朵粬鎵鏈夌偣璁句負鏈爣璁扮殑銆?br>
銆銆2) 媯楠屼粠鎵鏈夊凡鏍囪鐨勭偣k鍒板叾鐩存帴榪炴帴鐨勬湭鏍囪鐨勭偣j鐨勮窛紱伙紝騫惰緗細
dj=min錛籨j, dk+lkj錛?br>
寮忎腑錛宭kj鏄粠鐐筴鍒癹鐨勭洿鎺ヨ繛鎺ヨ窛紱匯?br>
銆銆3) 閫夊彇涓嬩竴涓偣銆備粠鎵鏈夋湭鏍囪鐨勭粨鐐逛腑錛岄夊彇dj 涓渶灝忕殑涓涓猧錛?br>
di=min錛籨j, 鎵鏈夋湭鏍囪鐨勭偣j錛?br>
鐐筰灝辮閫変負鏈鐭礬寰勪腑鐨勪竴鐐癸紝騫惰涓哄凡鏍囪鐨勩?br>
銆銆4) 鎵懼埌鐐筰鐨勫墠涓鐐廣備粠宸叉爣璁扮殑鐐逛腑鎵懼埌鐩存帴榪炴帴鍒扮偣i鐨勭偣j*錛屼綔涓哄墠涓鐐?璁劇疆錛歩=j*
浠g爜濡備笅:
using namespace std;
const int INF = 0x7FFFFFFF;
const int MAX = 105;
int graph[MAX][MAX];
int N,M;
int Dijkstra ( int beg, int end )
{
bool hash[N+1];
int path[N+1];
for ( int i = 0; i <= N; ++ i )
{
hash[i] = true;
path[i] = INF;
}
hash[beg] = false;
path[beg] = 0;
while ( beg != end )
{
for ( int i = 1; i <= N; ++ i )
{
if ( graph[beg][i] )
{
if ( path[i] > path[beg] + graph[beg][i] )
path[i] = path[beg] + graph[beg][i];
}
}
int min = INF;
for ( int i = 1; i <= N; ++ i )
{
if ( min > path[i] && hash[i] )
{
min = path[i];
beg = i;
}
}
hash[beg] = false;
}
return path[end];
}
int main ()
{
while ( scanf ( "%d%d",&N,&M ) , N + M )
{
memset ( graph , 0 , sizeof ( graph ) );
for ( int i = 1; i <= M; ++ i )
{
int r,c,cost;
scanf ( "%d%d%d",&r,&c,&cost );
if ( graph[r][c] == 0 )
graph[r][c] = graph[c][r] = cost ;
else
{
if ( cost < graph[r][c] )
graph[r][c] = graph[c][r] = cost ;
}
}
cout << Dijkstra ( 1,N ) << endl;;
}
return 0;
}
]]>