给两个长度相等的字符串 从第一个转换到第二个。
对应相同位置转换 如果一样 就不用转了 否则要一定的cost cost是一个常量k
但是有一些转换 是幸运的 有固定的常量 现在问 从a到b 两个字符串转换 最少的cost
给出两个字符串 和 m k
接着m组 幸运转换 两个小写字母 和一个cost
主要是 比如从a 到c 可以先从a到b 再从b到c 这样以来 就是要求出两个字母之间的最短路。如果比k小 就按照这个cost转换 如果比k大 就按照k转换
回来又wa了四次我擦了。。。
因为ans 要用 long long 也没看题 直接就敲了。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=26;
const int inf=1000000007;
int map[maxn][maxn];
void init()
{
for(int i=0;i<maxn;++i)
for(int j=0;j<maxn;++j)
map[i][j]=inf;
}
void floyd()
{
for(int k=0;k<maxn;++k)
for(int i=0;i<maxn;++i)
for(int j=0;j<maxn;++j)
if(i!=j&&map[i][k]+map[k][j]<map[i][j])
map[i][j]=map[i][k]+map[k][j];
}
int main()
{
//freopen("/home/gl/acm/in","r",stdin);
string stra,strb;
while(cin>>stra>>strb)
{
init();
int m,k,cost;
char cha,chb;
scanf("%d %d",&m,&k);
for(int i=0;i<m;++i)
{
cin>>cha>>chb>>cost;
if(map[cha-'a'][chb-'a']==inf)
map[cha-'a'][chb-'a']=cost;
else if(cost<map[cha-'a'][chb-'a'])
map[cha-'a'][chb-'a']=cost;
}
floyd();
long long ans=0;
int size=stra.size();
for(int i=0;i<size;++i)
{
if(stra[i]==strb[i])
continue;
int len=map[stra[i]-'a'][strb[i]-'a'];
if(len<k)
ans+=len;
else
ans+=k;
}
printf("%lld\n",ans);
}
return 0;
}