- #include<vector>
- #include<iostream>
- #include<iomanip>
- #include<string>
- using namespace std;
- const int MAXN = 30;
- const int MAXDIST = 100000000;
- int distanc[MAXN][MAXN];
- //从交点a到b的最短距离
- int dist[MAXN][MAXN];
- //从交点a到b最段路径要经过的下一个交点
- int next[MAXN][MAXN];
- //在交点a处的城市的名称
- string name[MAXN];
- //all the Cs that the shortest path from A to C will pass B.
- vector<int> passby[MAXN][MAXN];
- //调试用方法, 打印二维数组的内容
- void ShowMatrix(int matrix[MAXN][MAXN], int rows, int cols)
- {
- int i, j;
- for ( i = 0; i < rows; i ++ )
- {
- for ( j = 0; j < cols; j ++ )
- cout << setw(11) << matrix[i][j] << " ";
- cout << endl << endl << endl;
- }
- cout << " ------------------------ " << endl;
- }
- //调试方法, 打印出从节点a 到 b的最段路径
- void FindPath(int a, int b)
- {
- while ( a != b )
- {
- cout << a << "->" ;
- a = next[a][b];
- }
- cout << b << endl;
- }
- //对道路通往的城市排序
- //排序方法, 按 (距离, 城市名)排序
- void sortD(vector<int> &verc, int a, int b, int dis)
- {
- int i, j, di, dj, t;
- for ( i = 0; i < verc.size(); i ++)
- {
- for ( j = i + 1; j < verc.size(); j ++)
- {
- di = ( dist[a][verc[i]] - dis + 50 ) / 100;
- dj = ( dist[a][verc[j]] - dis + 50 ) / 100;
- if ( di > dj || di == dj && name[verc[i]] > name[verc[j]])
- {
- t = verc[i];
- verc[i] = verc[j];
- verc[j] = t;
- }
- }
- }
- }
- int main()
- {
- int n,/*Number of intersections*/
- m,/*Number of roads*/
- k,/*Number of cities*/
- s,/*Number of Signs*/
- a, b, dis, i, j;
- float d;
- cin >> n >> m >> k;
- for ( a = 0; a < n; a ++ )
- for ( b = 0; b < n ; b ++ )
- dist[a][b] = distanc[a][b] = MAXDIST;
- for ( a = 0; a < n; a++)
- dist[a][a] = distanc[a][a] = 0;
- //读入铁路图信息
- for ( i = 0; i < m; i ++ )
- {
- cin >> a >> b >> d;
- dis = (int) (d * 100 + 0.5f); //加0.5避免浮点数精度错误
- distanc[a][b] = distanc[b][a]
- = dist[a][b] = dist[b][a] = dis;
- }
- //读入城市名称
- for ( i = 0; i < k; i ++ )
- {
- cin >> a;
- cin >> name[a];
- }
- /************************************************************************/
- /* 以下程序段计算交点间最短路径并记录路径经由的下一个交点 */
- /************************************************************************/
- for ( a = 0; a < n; a ++ )
- for ( b = 0; b < n; b ++ )
- if ( dist[a][b] < MAXDIST )
- next[a][b] = b;
- //Dijstra's algorithm.
- for ( s = 0; s < n; s ++ )
- for ( a = 0; a < n; a ++ )
- if ( dist[a][s] < MAXDIST )
- for ( b = 0; b < n; b ++ )
- if ( dist[a][b] > dist [a][s] + dist[s][b] )
- {
- dist[a][b] = dist[a][s] + dist[s][b];
- }
- //最短路径下一步节点
- for ( a = 0; a < n; a ++ )
- for ( b = 0; b < n; b ++)
- if ( a != b)
- for ( s = 0; s < n; s ++)
- if ( s != a && s != b && distanc[a][s] < MAXDIST
- && dist[a][b] == dist[a][s] + dist[s][b] )
- {
- next[a][b] = s;
- break;
- }
- for ( a = 0; a < n; a ++ )
- for ( b = 0; b < n; b ++ )
- if ( a != b )
- {
- passby[a][next[a][b]].push_back(b);
- }
- cin >> s;
- for ( i = 0 ; i < s ; i ++ )
- {
- cin >> a >> b >> d;
- dis = (int) ( d * 100 + 0.5f );
- sortD( passby[a][b], a, b, dis );
- for (j = 0; j < passby[a][b].size(); j++)
- {
- k = passby[a][b][j];
- if ( name[k] != "" )
- cout << setw(20) << setiosflags(ios_base::left) << name[k]
- << ( dist[a][k] - dis + 50 ) / 100 << endl;
- }
- cout << endl;
- }
- return 0;
- }
POJ1097 Roads Scholar
最新推荐文章于 2018-05-30 23:58:03 发布