C++ P0002 旅行计划

来源:互联网 发布:高清网络电视频道 编辑:程序博客网 时间:2024/05/16 05:42

题目:旅行计划

第一次搞输出多个最短路径,搞了有一会儿,方法不太好,有更好的方法可以教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;}

上面的输出路径或是储存路径,都感觉实现不太好,有什么更好的方法请下面留言!

0 0