蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手。幸运的是,小岛上有一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印。
封印之门上有一串文字,只包含小写字母,有
k
种操作规则,每个规则可以把一个字符变换成另外一个字符。经过任意多次操作以后,最后如果能把封印之门上的文字变换成解开封印之门的文字,封印之门将会开启。
蒜头君战斗力超强,但是不擅计算,请你帮忙蒜头君计算至少需要操作多少次才能解开封印之门。
Sample Input
abcd
dddd
3
a b
b c
c d
Sample Output
6
思路:直接flayd。初始化两个字母之间的距离为无穷。相同字母之间的距离为0。
#include <bits/stdc++.h>
using namespace std;
string s1,s2;
int dis[30][30];
int t,inf=10000;
void flayd()
{
for(int k=0;k<26;k++)
for(int i=0;i<26;i++)
for(int j=0;j<26;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
int main()
{
cin>>s1>>s2;
cin>>t;
char a,b;
int cnt=0;
memset(dis,inf,sizeof(dis));
while(t--)
{
cin>>a>>b;
dis[a-'a'][b-'a']=1;
}
for(int i=0;i<26;i++) dis[i][i]=0;
flayd();
for(int i=0;i<s1.size();i++)
{
if(s1[i]!=s2[i])
{
if(dis[s1[i]-'a'][s2[i]-'a']>=inf)
{
cout<<-1;
return 0;
}
else cnt+=dis[s1[i]-'a'][s2[i]-'a'];
}
}
cout<<cnt;
return 0;
}