// UVa 1247 - Interstar Transport
#include <iostream>
#include <vector>
#include <string>
#include <string.h>
using namespace std;
vector<char> sol;
char R['Z' + 1]['Z' + 1];
int D['Z' + 1]['Z' + 1];
void get_sol(char a, char b){
if (D[a][b] == 1)
sol.push_back(b);
else {
get_sol(a,R[a][b]);
get_sol(R[a][b],b);
}
}
int main() {
int n, m;
while (cin >> n >> m) {
int lnk['Z' + 1]['Z' + 1];
memset(lnk, 127, sizeof(lnk));
memset(D, 127, sizeof(D));
int oo = lnk[0][0];
for (int i = 0; i < m; i++) {
string a, b;
int c;
cin >> a >> b >> c;
lnk[a[0]][b[0]] = c;
lnk[b[0]][a[0]] = c;
D[a[0]][b[0]] = 1;
D[b[0]][a[0]] = 1;
D[a[0]][a[0]] = 0;
D[b[0]][b[0]] = 0;
}
// floyd
for (int k = 'A'; k <= 'Z'; k++)
for (int i = 'A'; i <= 'Z'; i++)
if (lnk[i][k] != oo) {
for (int j = 'A'; j <= 'Z'; j++)
if (lnk[k][j] != oo && lnk[i][k] + lnk[k][j] < lnk[i][j]
|| lnk[i][k] + lnk[k][j] == lnk[i][j]
&& D[i][j] > D[i][k] + D[k][j]) {
lnk[i][j] = lnk[i][k] + lnk[k][j];
D[i][j] = D[i][k] + D[k][j];
R[i][j] = k;
}
}
// queries
cin >> m;
for (int i=0; i<m; i++){
string a,b;
cin >> a >> b;
sol.clear();
get_sol(a[0],b[0]);
cout << a[0];
for (int j=0; j<sol.size(); j++)
cout << " " << sol[j];
cout << endl;
}
}
return 0;
}
Wednesday, May 13, 2015
UVa 1247 - Interstar Transport
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment