ZOJ 1456 最短路 輸出路徑

2021-06-17 23:37:33 字數 1487 閱讀 7509

這題本來覺得比較簡單的 可是一直wa 後來看別人解釋找到原因了

「這題難就難再要字典序輸出,要是單單floyd的話,無法保證最後得到的路徑字典序最小,乙個簡單的反例就是如果6 5 7 8 9和6 8 1 2 9以及6 10 1 2 9同時是6-9的最短路的話,如果忽略相等情況下的更新,6 8之間是不會被7作為中間節點而更新的,但是不忽略的話,又可能被中間比較大的節點更新了。所以直接floyd(採用path[i][j] = k表示i到j通過k點的方式還原路徑)是不滿足題意的。因此這裡採用另外一種記錄路徑的方式,path[i][j]表示從i到j的第二個元素編號,那麼由於僅僅只記錄了第二個元素,因此當距離相等的時候,我們就只需要考慮新的「第二個元素」是否更優。這樣可以避免將這個路徑進行輸出比較,如果距離相等,第二個元素相等,那麼最後還原出來的路徑就是一致的,無需更新。」

#include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const double pi = acos(-1.0);

template inline t max(t a, t b)

template inline t min(t a, t b)

const int n = 222;

const int m = 11111;

const ll mod = 1000000007ll;

const int dir[4][2] = ;

const int inf = 0x3f3f3f3f;

int buf[n][n];

int mp[n][n];

int path[n][n];

int shortest[n];

int val[n];

int main()

for (i = 1; i <= n; ++i)

for (j = 1; j <= n; ++j)

for (k = 1; k <= n; ++k)

else if (mp[j][k] == mp[j][i] + mp[i][k] + val[i])

}int u, v;

while (scanf("%d%d", &u, &v))

// k++; shortest[k] = u;

printf("from %d to %d :\n", u, v);

printf("path: %d", u);

for (k = u; k != v; k = path[k][v]) printf("-->%d", path[k][v]);

// printf("%d\n", v);

printf("\ntotal cost : %d\n\n", mp[u][v]);}}

return 0;

}

zoj2750(最短路徑)

題目大意 成語接龍,從第乙個到最後乙個點的最短路徑 選擇建圖的方式真的很重要,偷個懶,用dfs include include includeusing namespace std struct edge edges 1000000 const int mn 1001 int n,m,w mn ch...

輸出最短路路徑

include include define max 1000 using namespace std int map max 10 max 10 map i j 表示從i到j路上的花費 int tax max 10 每個城市的過路費 int path max 10 max 10 path i j ...

最短路 dijkstra演算法 路徑輸出

dijkstra 迪傑斯特拉 演算法 即給定圖和起點,通過演算法得到起點到其餘點的最短路徑。主要步驟就是 每次從剩餘頂點中選乙個離起點最近的點,然後更新這個點周圍的點離起點的距離,同時標記這個點。直到所有的點都被標記。01 23 10 00第二次遍歷結束path陣列 01 23 10 10 incl...