传送门:计蒜客A1594 封印之门
题目描述:
测试样例:
样例输入:
abcd
dddd
3
a b
b c
c d
样例输出:
6
思路:
floyd多源最短路,求出任意两个字母变换的最少次数。
AC代码:
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
int g[30][30];
char s1[1005],s2[1005];
void init()
{
for(int i=0;i<26;i++)
{
for(int j=0;j<26;j++)
g[i][j]=inf;
g[i][i]=0;
}
}
void floyd()
{
for(int i=0;i<26;i++)
for(int j=0;j<26;j++)
for(int k=0;k<26;k++)
if(g[j][k]>g[j][i]+g[i][k])
g[j][k]=g[j][i]+g[i][k];
}
int main()
{
init();
scanf("%s%s",&s1,&s2);
int m;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
char x,y;
scanf("\n%c %c",&x,&y);
if(x!=y) //这里需要注意一下
g[x-'a'][y-'a']=1;
}
floyd();
int len=strlen(s1);
int ans=0;
for(int i=0;i<len;i++)
{
int p1=s1[i]-'a';
int p2=s2[i]-'a';
if(g[p1][p2]==inf)
{
printf("-1");
return 0;
}
else
ans+=g[p1][p2];
}
printf("%d\n",ans);
return 0;
}