MiYu鍘熷垱, 杞笘璇鋒敞鏄?: 杞澆鑷?______________鐧界櫧銇眿
棰樼洰鍦板潃:
http://acm.hdu.edu.cn/showproblem.php?pid=2066
棰樼洰鎻忚堪:
涓涓漢鐨勬梾琛?br>Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4077 Accepted Submission(s): 1348
Problem Description
铏界劧鑽夊効鏄釜璺棿錛堝氨鏄湪鏉數(shù)寰呬簡涓騫村錛屽眳鐒惰繕浼?xì)鍦ㄦ牎鍥噷杩疯矾鐨勪汉锛屾?/span>~),浣嗘槸鑽夊効浠嶇劧寰堝枩嬈㈡梾琛岋紝鍥犱負(fù)鍦ㄦ梾閫斾腑 浼?xì)閬囪寰堝錆h錛堢櫧椹帇瀛愶紝^0^錛夛紝寰堝浜嬶紝榪樿兘涓板瘜鑷繁鐨勯槄鍘嗭紝榪樺彲浠ョ湅緹庝附鐨勯鏅?#8230;…鑽夊効鎯沖幓寰堝鍦版柟錛屽ス鎯寵鍘諱笢浜搧濉旂湅澶滄櫙錛屽幓濞佸凹鏂湅鐢?shù)濯?jiǎng)錛屽幓闃蟲槑灞變笂鐪嬫搗鑺嬶紝鍘葷航綰︾函綺圭湅闆櫙錛屽幓宸撮粠鍠濆挅鍟″啓淇★紝鍘誨寳浜帰鏈涘瓱濮滃コ……鐪肩湅瀵掑亣灝卞揩鍒頒簡錛岃繖涔堜竴澶ф鏃墮棿錛屽彲涓嶈兘嫻垂鍟婏紝涓瀹氳緇欒嚜宸卞ソ濂界殑鏀句釜鍋囷紝鍙槸涔熶笉鑳借崚搴熶簡璁粌鍟婏紝鎵浠ヨ崏鍎垮喅瀹氬湪瑕佸湪鏈鐭殑鏃墮棿鍘諱竴涓嚜宸辨兂鍘葷殑鍦版柟錛佸洜涓鴻崏鍎跨殑瀹跺湪涓涓皬闀囦笂錛屾病鏈夌伀杞︾粡榪囷紝鎵浠ュス鍙兘鍘婚偦榪戠殑鍩庡競鍧愮伀杞︼紙濂藉彲鎬滃晩~錛夈?br>
Input
杈撳叆鏁版嵁鏈夊緇勶紝姣忕粍鐨勭涓琛屾槸涓変釜鏁存暟T錛孲鍜孌錛岃〃紺烘湁T鏉¤礬錛屽拰鑽夊効瀹剁浉閭?cè)潥勫煄甯傜殑鏈塖涓紝鑽夊効鎯沖幓鐨勫湴鏂規(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
棰樼洰鍒嗘瀽:
鍒氬紑濮嬪仛鐨勬椂鍊欎篃娌″仛鍒嗘瀽, 鐩存帴灝辨槸鏋氫婦姣忎釜璧風(fēng)偣鍒版瘡涓粓鐐圭殑 鏈鐭窛紱? 鐒跺悗鍙栨渶鐭殑璺? 寰堟樉鐒? TLE.................
榪樻槸鑷繁娌℃湁鎶奃IJKSTRA 綆楁硶鐞嗚В濂?... 鍐嶆鐪嬩簡涓閬嶇畻娉曠殑鎻忚堪鍜屾暟鎹粨鏋勪功涓婄殑 sample鍚?鍙戠幇, 鍏跺疄綆楁硶鎵ц榪囩▼涓?br>宸茬粡鎶婅搗鐐瑰埌鍏朵粬鐐圭殑鏈鐭窛紱誨叏閮ㄧ畻鍑烘潵浜? 鎵浠ュ彧闇瑕?鏋氫婦姣忎釜璧風(fēng)偣灝卞彲浠ヤ簡, 鍏村涔嬩笅, 椹笂淇敼浜嗕唬鐮? Submit! ......
寰?鏉叿, 榪樻槸tle ...... 涓嶆槑鐧戒負(fù)浠涔?....鐪嬬綉涓婂叾浠栦漢鍐欑殑 瑙i鎶ュ憡 , 鍘熸潵寰堝浜轟篃鏄繖鍋氱殑, 鏋氫婦璧峰鐐? 浣嗘槸浠栦滑鐨勫嵈鍙互AC.
铏界劧鏃墮棿涓鑸槸 100MS宸﹀彸. 榪欓噷鎴戜竴鐩村緢綰犵粨, 涓嶆槑鐧藉悓鏍風(fēng)殑綆楁硶涓轟粈涔堟垜鐨勪細(xì)TLE.
鍦?AMB 澶х墰鐨勬彁紺轟笅, 涓嶉渶瑕佸叏閮ㄦ灇涓? 鍙鎶婃墍鏈夎搗鐐圭殑璺濈閮借緗垚0灝卞彲浠ヤ簡, 浣嗘槸涓嶇煡閬撲負(fù)浠涔? 榪樻槸涓鐩碩LE.
鏈鍚庣殑鍔炴硶鏄? 璁劇疆涓涓搗鐐規(guī)寚鍚戞墍鏈夎搗鐐? 涔嬮棿鐨勮窛紱昏緗負(fù) 1, 鍚屾牱 璁劇疆涓涓粓鐐規(guī)寚鍚戞墍鏈夌粓鐐? 璺濈鍚屾牱璁劇疆涓?, 鏈鍚?br>浣跨敤 DIJKSTRA 綆楁硶 姹傚嚭璧風(fēng)偣鍒扮粓鐐圭殑鏈鐭窛紱?- 2 灝辮浜?
浠g爜濡備笅:
#include <iostream>
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爜:
#include <iostream>
#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;
}

]]>