C++ P0002 旅行计划

题目:旅行计划

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

# include 
# include 
# include 
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;
}

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

你可能感兴趣的:(COGS题库)