Codeforces Beta Round #33 (Codeforces format) B. String Problem(Floyd)

添加链接描述
在这里插入图片描述
在这里插入图片描述
题意:给定两个初始字符串s和t,再给定n个变换,表示字母1变成字母2需要花费w的花费,问将两个字符串变成一样的最小花费。
思路:可以先求出每个字母转化成任意字母的最小花费,用Floyd求出就行。这题很容易想当然,比如字符串是a,字符串是b,一开始很容易想当然把a变成b或者把b变成a(就因为这样wa了好几次)。这样不行的原因看下面的样例
样例:
a
b
4
a b 100
b a 100
a x 10
b x 10
然后看的这里应该知道怎么做了

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+1;
const int inf=0x3f3f3f3f;
int n,ans,d[27][27],g[27][27];
char s1[maxn],s2[maxn],c[maxn];
void f()
{
	for(int k=0;k<26;++k)
	for(int i=0;i<26;++i)
	for(int j=0;j<26;++j)
	if(g[i][k]!=inf&&g[k][j]!=inf&&g[i][k]+g[k][j]<g[i][j])
	g[i][j]=g[i][k]+g[k][j];
}
int main()
{
	for(int i=0;i<26;++i)
	for(int j=0;j<26;++j)
	{
		if(i==j) g[i][j]==0;
		else g[i][j]=inf;
	}
	scanf("%s%s",s1,s2);
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		char u,v;
		int w;
		scanf(" %c %c %d",&u,&v,&w);
		g[u-'a'][v-'a']=min(w,g[u-'a'][v-'a']);
	}
	f();
	int len1=strlen(s1),len2=strlen(s2);
	if(len1!=len2){
		printf("-1\n");return 0;
	}
	for(int i=0;i<len1;++i)
	{
		int t1=s1[i]-'a',t2=s2[i]-'a',minn=inf;
		for(int j=0;j<26;++j)
		{
			if(g[t1][j]!=inf&&g[t2][j]!=inf&&minn>g[t1][j]+g[t2][j])
			minn=g[t1][j]+g[t2][j],c[i]='a'+j;
		}
		if(minn==inf)
		{
		printf("-1\n");return 0;
		}
		ans+=minn;
	}
	c[len1]='\0';
	printf("%d\n",ans);
	printf("%s\n",c);
}
发布了70 篇原创文章 · 获赞 0 · 访问量 2429

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104233081
今日推荐