其实就是相当于图中找最短路。.
多源最短路用floyd比较好,下面是代码。
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int INF = 999999;
int change[30][30];
void sovle()
{
string a,b;
int n;
cin >> a;
cin >> b;
cin >> n;
getchar();
for(int i=0; i<n; i++){
char To,From;
scanf("%c%*c%c", &To, &From);
getchar();
int to = To-'a';
int from = From - 'a';
if(to != from)
change[to][from] = 1;
}
for(int k=0; k<26; k++){///floyd要注意这三个循环的顺序
for(int i=0; i<26; i++){
for(int j=0; j<26; j++){
change[i][j] = min(change[i][k], change[i][k]+change[k][j]);
}
}
}
long long ans = 0;
for(int i=0; i<a.length(); i++){
if(change[a[i]-'a'][b[i]-'a'] == INF){
ans = -1;
break;
}
ans += change[a[i]-'a'][b[i]-'a'];
}
cout << ans << endl;
}
int main()
{
for(int i=0; i<30; i++){
for(int j=0; j<30; j++){
change[i][j] = INF;
if(i == j)
change[i][j] = 0;
}
}
sovle();
return 0;
}