1. Shortest path in multistage graphs. Find the shortest path from 0 to 15 for the following graph.
A multistage graph is a graph (1) G=(V,E) with V partitioned into K >= 2 disjoint subsets such that if (a,b) is in E, then a is in Vi , and b is in Vi+1 for some subsets in the partition; and (2) | V1 | = | VK | = 1.

#include<iostream>
#include<sstream>
#include<string>
#include<fstream>
using namespace std;
#define MAX 128
#define HUGE 9999

struct Item...{
int i,j;
int v;
};
Item A[MAX];//三元组元素
void print(int* s,int end)
...{
if(s[end] == 0)
...{
cout << end << "->";
return;
}
print(s,s[end]);
cout << end << "->";
}
void PrintPath(int* s,int length)
...{
cout << s[0] << "->";
print(s,length-1);
cout << "Shortest path!" << endl;
}
int main()
...{
string str;
int i,j,v;
int Alen = 0;
ifstream cin("4.txt");
while(getline(cin,str))
...{
istringstream stream(str);
stream>>i>>j>>v;
A[Alen].i = i;
A[Alen].j = j;
A[Alen].v = v;
Alen++;
}
int size = A[Alen-1].j + 1;
int* B = new int[size];//B[i]表示节点0到节点i的权值
int* S = new int[size]; //S[i]表示节点i的前驱
// memset(B,HUGE,size);
// memset(S,0,size);
for(int p = 0; p < size;p++)
...{
B[p] = HUGE;
S[p] = 0;
}
B[0] = 0;
cout <<endl;
for(int index = 0; index < Alen;index++)
...{
if(A[index].v + B[ A[index].i ] < B[ A[index].j ])
...{
B[ A[index].j ] = A[index].v + B[ A[index].i ];
S[ A[index].j ] = A[index].i;
}
}
for( p = 0; p < size;p++)
cout << S[p] << " ";
cout <<endl;
for(p = 0; p < size;p++)
cout << B[p] << " ";
cout << endl;
PrintPath(S,size);
return 0;
}
本文介绍了一种求解多阶段图中从起点到终点的最短路径算法,并通过具体的代码实现展示了如何处理此类问题。多阶段图是一种特殊的图结构,其顶点被划分为多个不相交的集合。
1492





