每两个字母可能双向奔赴!!!
Hack:
abcd
acer
6
b c 100
c b 10
c x 1
e x 3
c e 7
r d 11
ans:
25
abxd
如代码中的
for (int i = 0; i < n; i++) {
int dis1 = g[a[i] - 'a'][b[i] - 'a'];
int dis2 = g[b[i] - 'a'][a[i] - 'a'];
if (dis1 == 0x3f3f3f3f && dis2 == 0x3f3f3f3f) {
cout << "-1" << endl;
return 0 ;
}
if (dis1 < dis2)
ans += dis1, a[i] = b[i];
else
ans += dis2, b[i] = a[i];
}
应该为:
for (int i = 0; i < (int)a.length(); i++) {
int dis = 0x3f3f3f3f;
char ch;
for (int k = 0; k < 26; k++)
if (dis > g[a[i] - 'a'][k] + g[b[i] - 'a'][k])
dis = g[a[i] - 'a'][k] + g[b[i] - 'a'][k], ch = k + 'a';
if (dis == 0x3f3f3f3f) {
cout << "-1" << endl;
return 0;
}
ans += dis;
a[i] = ch;
}