挑戰程序設計競賽(第2版)第112頁勘誤
阿新 • • 發佈:2018-01-27
body pda ret oid print 最短 代碼 inf code
整個代碼段改為
// 輸入
int N, ML, MD; int AL[MAX_ML], BL[MAX_ML], DL[MAX_ML]; int AD[MAX_MD], BD[MAX_MD], DD[MAX_MD]; int d[MAX_N]; //最短距離 bool updated; // 是否有更新 void update(int& x, int y) { if (x > y) { x = y; updated = true; } } // 用Bellman-Ford算法計算d void bellmanford() { for (int k = 0; k <= N; k++) { updated = false; // 從i+1到i的權值為0 for (int i = 0; i + 1 < N; i++) { if (d[i + 1] < INF) update(d[i], d[i + 1]); } // 從AL到BL的權值為DL for (int i = 0; i < ML; i++) { if (d[AL[i] - 1] < INF) update(d[BL[i] - 1], d[AL[i] - 1] + DL[i]); } // 從BD到AD的權值為-DD for (int i = 0; i < MD; i++) { if (d[BD[i] - 1] < INF) update(d[AD[i] - 1], d[BD[i] - 1] - DD[i]); } } } void solve() { // 檢查是否存在負圈 fill(d, d + N, 0); bellmanford(); if (updated) { printf("-1\n"); return; } fill(d, d + N, INF); d[0] = 0; bellmanford(); int res = d[N - 1]; if (res == INF) res = -2; printf("%d\n", res); }
挑戰程序設計競賽(第2版)第112頁勘誤