#include <bits/stdc++.h>
using namespace std;
class Solution {
vector< int > * findEdit( unordered_map< int , unordered_map< int , pair< vector< int > * , int >>> & dp, int n, int x, int index, vector< vector< bool >> & graph, vector< string> & names, vector< string> & targetPath, int & edit) {
if ( index >= targetPath.size ( ) ) return new vector< int > ( ) ;
if ( dp.find ( x) ! = dp.end ( ) ) {
if ( dp[ x] .find ( index) ! = dp[ x] .end ( ) ) {
edit = dp[ x] [ index] .second ;
return dp[ x] [ index] .first ;
}
}
int res = INT_MAX ;
vector< int > * soln;
for ( int i= 0 ; i< n; i++ ) {
if ( graph[ x] [ i] ) {
int e= 0 ;
vector< int > * so = findEdit( dp, n, i, index+ 1 , graph, names, targetPath, e) ;
if ( e< res) {
res = e;
soln = so;
}
}
}
soln- > push_back( x) ;
if ( names[ x] .compare ( targetPath[ index] ) ! = 0 ) res++ ;
edit = res;
dp[ x] [ index] = make_pair( soln, res) ;
return soln;
}
public :
vector< int > mostSimilar( int n, vector< vector< int >> roads, vector< string> names, vector< string> targetPath) {
vector< vector< bool >> graph( n, vector< bool > ( n, false ) ) ;
for ( int i= 0 ; i< roads.size ( ) ; i++ ) {
graph[ roads[ i] [ 0 ] ] [ roads[ i] [ 1 ] ] = graph[ roads[ i] [ 1 ] ] [ roads[ i] [ 0 ] ] = true ;
}
unordered_map< int , unordered_map< int , pair< vector< int > * , int >>> dp;
vector< int > * soln;
int res = INT_MAX ;
for ( int i= 0 ; i< n; i++ ) {
int e= 0 ;
vector< int > * s = findEdit( dp, n, i, 0 , graph, names, targetPath, e) ;
if ( e< res) {
res = e;
soln = s;
}
}
reverse( soln- > begin( ) , soln- > end( ) ) ;
return * soln;
}
} ;
int main( ) {
Solution s;
auto ans = s.mostSimilar ( 5 , { { 0 ,2 } ,{ 0 ,3 } ,{ 1 ,2 } ,{ 1 ,3 } ,{ 1 ,4 } ,{ 2 ,4 } } ,
{ "ATL" ,"PEK" ,"LAX" ,"DXB" ,"HND" } , { "ATL" ,"DXB" ,"HND" ,"LAX" } ) ;
for ( auto & a: ans)
{
cout << a << " " ;
}
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBTb2x1dGlvbiB7CiAgICB2ZWN0b3I8aW50PiogZmluZEVkaXQodW5vcmRlcmVkX21hcDxpbnQsIHVub3JkZXJlZF9tYXA8aW50LCBwYWlyPHZlY3RvcjxpbnQ+KiwgaW50Pj4+JiBkcCwgaW50IG4sIGludCB4LCBpbnQgaW5kZXgsIHZlY3Rvcjx2ZWN0b3I8Ym9vbD4+ICZncmFwaCwgdmVjdG9yPHN0cmluZz4mIG5hbWVzLCB2ZWN0b3I8c3RyaW5nPiYgdGFyZ2V0UGF0aCwgaW50ICZlZGl0KSB7CiAgICAgICAgaWYoaW5kZXggPj0gdGFyZ2V0UGF0aC5zaXplKCkpIHJldHVybiBuZXcgdmVjdG9yPGludD4oKTsKICAgICAgICBpZihkcC5maW5kKHgpICE9IGRwLmVuZCgpKSB7CiAgICAgICAgICAgIGlmKGRwW3hdLmZpbmQoaW5kZXgpICE9IGRwW3hdLmVuZCgpKSB7CiAgICAgICAgICAgICAgICBlZGl0ID0gZHBbeF1baW5kZXhdLnNlY29uZDsKICAgICAgICAgICAgICAgIHJldHVybiBkcFt4XVtpbmRleF0uZmlyc3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW50IHJlcyA9IElOVF9NQVg7CiAgICAgICAgdmVjdG9yPGludD4gKnNvbG47CiAgICAgICAgCiAgICAgICAgZm9yKGludCBpPTA7IGk8bjsgaSsrKSB7CiAgICAgICAgICAgIGlmKGdyYXBoW3hdW2ldKSB7CiAgICAgICAgICAgICAgICBpbnQgZT0wOwogICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+KiBzbyA9IGZpbmRFZGl0KGRwLCBuLCBpLCBpbmRleCsxLCBncmFwaCwgbmFtZXMsIHRhcmdldFBhdGgsIGUpOwogICAgICAgICAgICAgICAgaWYoZTxyZXMpIHsKICAgICAgICAgICAgICAgICAgICByZXMgPSBlOwogICAgICAgICAgICAgICAgICAgIHNvbG4gPSBzbzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzb2xuLT5wdXNoX2JhY2soeCk7CiAgICAgICAgCiAgICAgICAgaWYobmFtZXNbeF0uY29tcGFyZSh0YXJnZXRQYXRoW2luZGV4XSkgIT0gMCkgcmVzKys7CiAgICAgICAgZWRpdCA9IHJlczsKICAgICAgICBkcFt4XVtpbmRleF0gPSBtYWtlX3BhaXIoc29sbiwgcmVzKTsKICAgICAgICByZXR1cm4gc29sbjsKICAgIH0KcHVibGljOgogICAgdmVjdG9yPGludD4gbW9zdFNpbWlsYXIoaW50IG4sIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gcm9hZHMsIHZlY3RvcjxzdHJpbmc+IG5hbWVzLCB2ZWN0b3I8c3RyaW5nPiB0YXJnZXRQYXRoKSB7CiAgICAgICAgdmVjdG9yPHZlY3Rvcjxib29sPj4gZ3JhcGgobiwgdmVjdG9yPGJvb2w+KG4sIGZhbHNlKSk7CiAgICAgICAgZm9yKGludCBpPTA7IGk8cm9hZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgZ3JhcGhbcm9hZHNbaV1bMF1dW3JvYWRzW2ldWzFdXSA9IGdyYXBoW3JvYWRzW2ldWzFdXVtyb2Fkc1tpXVswXV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgICB1bm9yZGVyZWRfbWFwPGludCwgdW5vcmRlcmVkX21hcDxpbnQsIHBhaXI8dmVjdG9yPGludD4qLCBpbnQ+Pj4gZHA7CiAgICAgICAgdmVjdG9yPGludD4gKnNvbG47CiAgICAgICAgaW50IHJlcyA9IElOVF9NQVg7CiAgICAgICAgCiAgICAgICAgZm9yKGludCBpPTA7aTxuO2krKykgewogICAgICAgICAgICBpbnQgZT0wOwogICAgICAgICAgICB2ZWN0b3I8aW50PiAqcyA9IGZpbmRFZGl0KGRwLCBuLCBpLCAwLCBncmFwaCwgbmFtZXMsIHRhcmdldFBhdGgsIGUpOwogICAgICAgICAgICBpZihlPHJlcyl7CiAgICAgICAgICAgICAgICByZXMgPSBlOwogICAgICAgICAgICAgICAgc29sbiA9IHM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV2ZXJzZShzb2xuLT5iZWdpbigpLCBzb2xuLT5lbmQoKSk7CiAgICAgICAgcmV0dXJuICpzb2xuOwogICAgfQp9OwoKaW50IG1haW4oKSB7CglTb2x1dGlvbiBzOwoJYXV0byBhbnMgPSBzLm1vc3RTaW1pbGFyKDUsIHt7MCwyfSx7MCwzfSx7MSwyfSx7MSwzfSx7MSw0fSx7Miw0fX0sIAoJeyJBVEwiLCJQRUsiLCJMQVgiLCJEWEIiLCJITkQifSwgeyJBVEwiLCJEWEIiLCJITkQiLCJMQVgifSk7Cglmb3IgKGF1dG8gJmE6IGFucykKCXsKCQljb3V0IDw8IGEgPDwgIiAiOwoJfQoJcmV0dXJuIDA7Cn0=