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 Input4 5 0 3 0 1 1 20 1 3 2 30 0 3 4 10 0 2 2 20 2 3 1 20Sample 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; }