程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 1030. Travel Plan (30) PAT

1030. Travel Plan (30) PAT

編輯:C++入門知識

A traveler's map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a program to help a traveler to decide the shortest path between his/her starting city and the destination. If such a shortest path is not unique, you are supposed to output the one with the minimum cost, which is guaranteed to be unique.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 4 positive integers N, M, S, and D, where N (<=500) is the number of cities (and hence the cities are numbered from 0 to N-1); M is the number of highways; S and D are the starting and the destination cities, respectively. Then M lines follow, each provides the information of a highway, in the format:

City1 City2 Distance Cost

where the numbers are all integers no more than 500, and are separated by a space.

Output Specification:

For each test case, print in one line the cities along the shortest path from the starting point to the destination, followed by the total distance and the total cost of the path. The numbers must be separated by a space and there must be no extra space at the end of output.

Sample Input
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
Sample Output
0 2 3 3 40

AC代碼:
//最短路徑問題的變異版本,本代碼采用的迪傑斯特拉算法,注意重邊的情況

#include
#include
using namespace std;
#define N 500
#define INF 1000000000

int dist[N][N], price[N][N]; //使用鄰接矩陣存儲
int set[N]; //標志是否被訪問過
int dis[N], pri[N]; //存放起點到各點的最短距離和花費
int path[N]; //存儲起點到各個點最短路徑中的倒數第二個點
int sta[1000]; //利用數組模擬棧進行路徑輸出

int main() {
	//freopen("in.txt","r",stdin);
	int n, m;
	while(scanf("%d %d",&n,&m)!=EOF && (n||m)) {
		int s, t;
		scanf("%d %d",&s,&t);
		int i, j;
		int a, b, d, p;
		for(i=0; i d) { //當有重邊時,更新相關信息
				dist[a][b] = dist[b][a] = d;
				price[a][b] = price[b][a] = p;
			}
			if(dist[a][b] == d && p pri[midp]+price[midp][j]) {
						dis[j] = dis[midp]+dist[midp][j];
						pri[j] = pri[midp]+price[midp][j];
						path[j] = midp;
					}
				}
			}
		}
		
		int tmp = t;
		int top = 0;
		while(path[tmp]!=-1) {
			sta[top++] = path[tmp];
			tmp = path[tmp];
		}
		while(top>0) {
			printf("%d ",sta[--top]);
		}
		printf("%d ",t); //輸出終點

		printf("%d %d\n",dis[t],pri[t]);
	}

	return 0;
}


						

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved