C++ P0002 旅行计划

    xiaoxiao2021-12-14  22

    题目:旅行计划

    第一次搞输出多个最短路径,搞了有一会儿,方法不太好,有更好的方法可以教me!

    # include <iostream> # include <cstdio> # include <cstring> using namespace std; const int inf = 0x7fffffff/3; int n, m, v, ui, vi, ti, park, minx, sizes; int cost[110], path[10010], map[110][110], to[10010]; bool vis[110]; int main() { // freopen("djs.in", "r", stdin); // freopen("djs.out", "w", stdout); cin >> n >> m >> v; for(int i = 0; i <= n; i++) { // 再求最短路之前,把各各边赋值为+∞ cost[i] = inf; for(int j = 0; j <= n; j++) map[i][j] = inf; } for(int i = 1; i <= m; i++) { cin >> ui >> vi >> ti; map[ui][vi] = ti; // 路径单向储存 } cost[v] = 0; for(int i = 0; i <= n; i++) { // 最短路主体,上文讲过,就不多说了 park = 0, minx = inf; for(int j = 0; j <= n; j++) if(!vis[j] && cost[j] < minx) minx = cost[park = j]; vis[park] = true; for(int j = 0; j <= n; j++) if(!vis[j] && cost[j] > cost[park] + map[park][j]) { cost[j] = cost[park] + map[park][j]; path[j] = park; // 这里不同的是要保存路径 } } for(int i = 0; i < n; i++) { // 输出略长 cout << i << ":" << endl; if(cost[i] >= inf || i == v) cout << "no" << endl; else { park = i; to[sizes = 1] = park; cout << "path:"; while(park != v) to[++sizes] = (park = path[park]); // 因为储存是v->j,导致输出会逆序,所以放到to数组再逆序输出 for(int j = sizes; j >= 1; j--) cout << to[j] << " "; cout << endl << "cost:" << cost[i] << endl; } } return 0; } 上面的输出路径或是储存路径,都感觉实现不太好,有什么更好的方法请下面留言!

    转载请注明原文地址: https://ju.6miu.com/read-962989.html

    最新回复(0)