String Problem(模板)【最短路】
String Problem
Boy Valera likes strings. And even more he likes them, when they are identical. That's why in his spare time Valera plays the following game. He takes any two strings, consisting of lower case Latin letters, and tries to make them identical. According to the game rules, with each move Valera can change one arbitrary character Ai in one of the strings into arbitrary character Bi, but he has to pay for every move a particular sum of money, equal to Wi. He is allowed to make as many moves as he needs. Since Valera is a very economical boy and never wastes his money, he asked you, an experienced programmer, to help him answer the question: what minimum amount of money should Valera have to get identical strings.
Input
The first input line contains two initial non-empty strings s and t, consisting of lower case Latin letters. The length of each string doesn't exceed 105. The following line contains integer n (0 ≤ n ≤ 500) — amount of possible changings. Then follow n lines, each containing characters Ai and Bi (lower case Latin letters) and integer Wi (0 ≤ Wi ≤ 100), saying that it's allowed to change character Ai into character Bi in any of the strings and spend sum of money Wi.
Output
If the answer exists, output the answer to the problem, and the resulting string. Otherwise output -1 in the only line. If the answer is not unique, output any.
Examples
input
Copy
uayd
uxxd
3
a x 8
x y 13
d c 3
output
Copy
21
uxyd
input
Copy
a
b
3
a b 2
a b 3
b a 5
output
Copy
2
b
input
Copy
abc
ab
6
a b 4
a b 7
b a 8
c b 11
c a 3
a c 0
output
Copy
-1
思路:
· 开始看题目没看太仔细,没感觉是最短路,因为我只是考虑了上下两个字母之间转换:
a
b
a→b 或者是 b→a
没考虑到 a→c→d→e
b→e 这种情况
· 看懂以后就知道是模板题了,有一点不同的是:
要将字符转换为数字表示最短路,在判断a变为什么的时候要先将a到其余25个点的最短路存进二维数组 (其余字母同理), 下面是代码:
for(int i=1;i<=26;i++){
diji(i);
for(int j=1;j<=26;j++){
if(i==j){
num[i][j]=0;
}
else{
num[i][j]=dis[j];
}
}
}
· 想知道a最终变成什么就要判断到其余各点距离的最小值:
如果minn==MAX 即表示该点无法通过条件转化成其他字母,要输出 -1
否则 sum+=minn
· 但要注意:
两次输入相同的字母关系要取最小的 进行 addnode(将两个点用链式前向星连起来)
AC代码:
#include<stdio.h>
#include<string.h>
const int MAX=1e5;
struct node{
int to;
int len;
int next;
}edge[MAX+5];
int ans;
int head[MAX+5];
void addnode(int u,int v,int w)
{
edge[ans].to=v;
edge[ans].len=w;
edge[ans].next=head[u];
head[u]=ans++;
}
void allbegin()
{
memset(head,-1,sizeof(head));
ans=0;
}
int vis[MAX+5],dis[MAX+5];
void diji(int s)
{
for(int i=1;i<=26;i++){
dis[i]=MAX;
vis[i]=0;
}
dis[s]=0;
while(1){
int k=-1,len=MAX;
for(int i=1;i<=26;i++){
if(!vis[i]&&len>dis[i]){
k=i;
len=dis[i];
}
}
if(k==-1){
break;
}
vis[k]=1;
for(int j=head[k];~j;j=edge[j].next){
int t=edge[j].to;
if(!vis[t]&&dis[t]>edge[j].len+dis[k]){
dis[t]=edge[j].len+dis[k];
}
}
}
} //上面是迪杰斯特拉模板
int main()
{
int num[55][55],n;
char a[MAX+5],b[MAX+5],c[MAX+5];
memset(num,-1,sizeof(num));
scanf("%s%s",a,b);
int la=strlen(a);
int lb=strlen(b);
scanf("%d",&n);
allbegin();
for(int i=1;i<=n;i++){
int w;
char u[5],v[5];
scanf("%s%s%d",u,v,&w);
int u1=u[0]-'a'+1;
int v1=v[0]-'a'+1;
if(num[u1][v1]==-1||num[u1][v1]>w){
addnode(u1,v1,w);
}
}
if(la!=lb){ //长度不等 直接输出-1
printf("-1\n");
}
else{ //将26个字母任意两点距离打表
for(int i=1;i<=26;i++){
diji(i);
for(int j=1;j<=26;j++){
if(i==j){
num[i][j]=0;
}
else{
num[i][j]=dis[j];
}
}
}
int sum=0;
for(int i=0;i<la;i++){
int a1=a[i]-'a'+1;
int b1=b[i]-'a'+1;
if(a1==b1){
c[i]=a[i];
}
else{ //暴力找出与两个字符 转换值之和最小的 字母(数字代表字母)
int minn=MAX;
for(int j=1;j<=26;j++){
if(num[a1][j]+num[b1][j]<minn){
c[i]='a'+j-1;
minn=num[a1][j]+num[b1][j];
}
}
if(minn==MAX){ //没有条件将其转换成其他值 结果任然是MAX 输出-1
printf("-1\n");
return 0;
}
else{
sum+=minn;
}
}
}
printf("%d\n",sum);
puts(c);
}
return 0;
}
String Problem(模板)【最短路】的更多相关文章
- HDOJ3374 String Problem 【KMP】+【最小表示法】
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu String Problem(最小表示法入门题)
hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...
- HDU 3374 String Problem(KMP+最大/最小表示)
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 【HDU3374】 String Problem (最小最大表示法+KMP)
String Problem Description Give you a string with length N, you can generate N strings by left shift ...
- HDU 3374 String Problem (KMP+最大最小表示)
HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others) Memory ...
- String Problem hdu 3374 最小表示法加KMP的next数组
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- ACM-ICPC2018南京赛区 Mediocre String Problem
Mediocre String Problem 题解: 很容易想到将第一个串反过来,然后对于s串的每个位置可以求出t的前缀和它匹配了多少个(EXKMP 或者 二分+hash). 然后剩下的就是要处理以 ...
- hdu3374 String Problem【最小表示法】【exKMP】
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 5772 String problem 最大权闭合子图
String problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5772 Description This is a simple pro ...
随机推荐
- fastDFS多线程并发执行出现的问题
--------------------- 原作者:Java高级开发 来源:CSDN 原文:https://blog.csdn.net/hang1995/article/details/7924 ...
- IE8/IE9/IE10打开网页后,自动设置浏览器模式为“IE8/IE9/IE10兼容性视图”
http://blog.snsgou.com/post-16.html 作者:SNSGOU 发布于:2013-07-17 22:23:05 分类:CSS/HTML 评论(0) 浏览(132 ...
- 量子纠错码——Clifford group
Clifford code Clifford group是什么? 简单的公式来表达,就是 \(Cl_{n}=\left\{U: U P_{n} U^{\dagger} \in P_{n}\right\ ...
- 设计模式:Filter+Servlet+反射
传统设计 分类管理需要:增加,删除,编辑,修改,查询5个服务端功能. 一个路径对应一个Servlet的思路,就需要设计5个Servlet类,并且在web.xml中配置5个路径. CategoryAdd ...
- 聊聊UDP、TCP和实现一个简单的JAVA UDP小Demo
最近真的比较忙,很久就想写了,可是一直苦于写点什么,今天脑袋灵光一闪,觉得自己再UDP方面还有些不了解的地方,所以要给自己扫盲. 好了,咱们进入今天的主题,先列一下提纲: 1. UDP是什么,UDP适 ...
- Spring_api方式实现aop
第一步: public interface UserService { public void add(); public void update(int a); public void delete ...
- MySQL知识-MySQL不同版本多实例
一.不同版本多实例 0.软连接不同版本软件,修改环境变量 [root@db01 database]# ln -s mysql-5.6.46-linux-glibc2.12-x86_64 mysql ...
- MySQL常用控制台指令
MySQL服务的启用与停止 MySQL服务的启用: net start mysql80 MySQL服务的停止: net stop mysql80 MySQL的登入与退出 数据库的登入: mysql - ...
- [书籍分享]0-001.rework(重来:更为简单有效的商业思维)
封面 内容简介 大多数的企业管理的书籍都会告诉你:制定商业计划.分析竞争形势.寻找投资人等等.如果你要找的是那样的书,那么把这本书放回书架吧. 这本书呈现的是一种更好.更简单的经商成功之道.读完 ...
- 安装和换源pip
pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能 一.ubuntu安装和配置pip 1.进入终端,输入命令sudo su root ,输入密码后进入r ...