Codeforces 33B. String Problem(Floyd最短路)

题目链接:http://codeforces.com/contest/33/problem/B


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两个字符串,n中变化,接下来n行,每行表示从字符1到字符2要花费代价val,问将a,b变成一样所需花费代价最小值,不能输出-1。


思路:将26个字符之间的变化代价用Floyd跑出来,求最小即可。

代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<map>

using namespace std;

#define FOU(i,x,y) for(int i=x;i<=y;i++)
#define FOD(i,x,y) for(int i=x;i>=y;i--)
#define MEM(a,val) memset(a,val,sizeof(a))
#define PI acos(-1.0)

const double EXP = 1e-9;
typedef long long ll;
typedef unsigned long long ull;
const int INF = 0x3f3f3f3f;
const ll MINF = 0x3f3f3f3f3f3f3f3f;
const double DINF = 0xffffffffffff;
const int mod = 1e9+7;
const int N = 1e5+5;

char a[N],b[N],c[N];
int change[30][30];

int mp[30][30];
int d[30][30];

void Floyd()
{
    int n=25;
    for(int i=0;i<=n;i++)
        for(int j=0;j<=n;j++)
            d[i][j]=mp[i][j];

    for(int k=0;k<=n;k++)  //枚举以k为中间点的所有点的最短路
        for(int i=0;i<=n;i++)
            for(int j=0;j<=n;j++)
                d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
//    for(int i=0;i<26;i++)
//    {
//        for(int j=0;j<26;j++)
//        {
//            printf("%c->%c=%d\n",'a'+i,'a'+j,d[i][j]);
//        }
//    }
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    std::ios::sync_with_stdio(false);
    int n,val;
    char x,y;
    scanf(" %s %s",a,b);
    scanf("%d",&n);
    for(int i=0;i<30;i++)
        for(int j=0;j<30;j++)
        {
            if(i==j)
                mp[i][j]=0;
            else
                mp[i][j]=INF;
        }
    for(int i=1;i<=n;i++)
    {
        scanf(" %c %c %d",&x,&y,&val);
        int t1=x-'a';
        int t2=y-'a';
        mp[t1][t2]=min(mp[t1][t2],val);
    }
    Floyd();
    int len1=strlen(a);
    int len2=strlen(b);
    if(len1!=len2)
    {
        printf("-1\n");
        return 0;
    }
    bool flag = false;
    int ans=0;
    for(int i=0;i<len1;i++)
    {
        int minn=INF;
        int t1=a[i]-'a';
        int t2=b[i]-'a';
        for(int j=0;j<26;j++)
        {
            int x1 = d[t1][j];
            int x2 = d[t2][j];
            //printf("%c\n",'a'+j);
            //printf("x1=%d\n",x1);
            //printf("x2=%d\n",x2);
            if(x1!=INF&&x2!=INF&&minn>x1+x2)
            {
                minn=x1+x2;
                c[i]='a'+j;
            }
        }
        //printf("%d=%d\n",i,minn);
        if(minn==INF)
        {
            flag=true;
            break;
        }
        ans+=minn;
    }
    if(flag)
        printf("-1\n");
    else
    {
        c[len1]='\0';
        printf("%d\n",ans);
        printf("%s\n",c);
    }
    return 0;
}

数字治理作为数字经济时代政府治理现代化的重要方向,强调利用数字技术优化政府组织运行机制、促进政务数据共享、提升公共服务效率,实现由传统行政管理向数据驱动型治理转变 2014年,国家启动“信息惠民国家试点城市建设”,选择80个城市开展试点,核心内容包括:建设政务数据平台、推动数据共享、推动“一网通办”等,是我国数字治理实践的重要探索 本文借鉴刘奥龙等(2026)的研究思路和方法,将信息惠民国家试点城市建设作为数字治理的准自然实验,衡量各城市政府数字治理,整理形成地级市信息惠民政策试点DID数据,并进一步构建省份数字治理程度指标数据,为数字治理经济效应研究提供数据支持 具体整理过程如下: 1.城市政府数字治理:采用信息惠民国家试点城市冲击来衡量各城市政府数字治理,城市若成为信息惠民国家试点城市取值为1, 表明城市推行政府数字治理,否则为0 2.省份数字治理程度:选择各省份内信息惠民国家试点城市数量占省内所有城市的比值来衡量省份整体推进数字治理的程度 一、数据介绍 数据名称:政府数字治理程度_省+地级市 数据范围:省份、地级市 时间范围:2000-2025年 样本数量:省份806条;地级市7722条 数据来源:国家发展改革委 数据说明:含信息惠民试点城市名单、省份数字治理程度、地级市DID明细数据等 二、数据指标 年份 省份 省份代码 所属地域 省内城市总数量 当年实施试点城市数量 数字治理程度 年份 省份 城市 省份代码 城市代码 所属地域 胡焕庸线 “信息惠民”试点时间 Treat Post DID 三、参考文献 [1]刘奥龙,马亦凡,高娜娜.打破创新藩篱:数字治理能否推动区域协同创新[J].山西财经大学学报,2026,48(3):26-38.
内容概要:本文以有源中点箝位(ANPC)三电平并网逆变器为研究对象,提出并构建了一套融合双极性倍频脉宽调制(DPWMA)、正负序分离锁相控制与电网电压前馈的一体化高性能并网控制策略。通过深入分析ANPC三电平拓扑在开关损耗均衡、中点电位可控性及输出谐波低等方面的结构优势,确立了其作为大功率高质量并网系统的硬件基础。在此基础上,DPWMA调制策略有效提升等效开关频率,显著降低输出电流电压的总谐波畸变率,优化稳态电能质量;正负序分离锁相技术精准剥离电网电压中的负序扰动分量,保障电网不平衡工况下的相位同步精度与并网电流对称性;电网电压前馈控制则通过前瞻性补偿机制,突破传统闭环控制的响应滞后瓶颈,大幅提升系统在电压骤变、畸变等动态扰动下的抗扰能力与动态响应速度。研究通过搭建完整的Simulink仿真模型,在稳态对称、电网不平衡及动态切换等多种工况下进行全面验证,结果表明该复合控制策略在电能质量、运行稳定性与工况适应性方面均具有显著优越性。; 适合人群:具备电力电子、自动控制或新能源并网等相关专业背景,从事科研、工程开发或处于研究生及以上学习阶段的专业技术人员。; 使用场景及目标:①应用于光伏发电、风力发电等新能源系统的大功率并网逆变器高性能控制设计;②解决电网电压不平衡、畸变等复杂非理想工况下的并网稳定性与电能质量问题;③提升工业级并网设备的动态响应速度与运行可靠性;④为相关领域的仿真建模、控制算法开发与性能优化提供系统性的技术参考与实现方案。; 阅读建议:建议结合文中所述的Simulink仿真模型进行实践操作,重点深入理解DPWMA调制的具体实现逻辑、正负序分离锁相环的设计原理以及前馈-反馈复合控制结构的集成方法,通过设置不同工况的对比仿真实验,直观体会各项关键技术对系统整体性能的提升作用。
内容概要:本文研究了离网光伏直流微网中功率供需失衡的抑制机制,重点探讨光伏大功率点跟踪(MPPT)技术与锂离子电池储能系统在“削峰填谷”中的协同控制策略,并通过Simulink仿真平台搭建了完整的光伏-储能-负载系统模型进行验证。系统由光伏阵列、Boost升压电路、双向DC-DC变换器及锂电池储能单元构成,通过MPPT实时捕获光伏大输出功率,同时利用储能系统的双向充放电能力平抑功率波动,实现能量的时空转移与动态平衡。研究涵盖系统建模、控制逻辑设计与多工况仿真分析,全面验证了该协同机制在应对光照强度变化和负载突变等不确定因素时的有效性与鲁棒性,显著提升了微网在离网条件下的能量自给能力和运行稳定性。; 适合人群:具备电力电子、新能源或自动控制基础知识,从事微电网、光伏发电或储能系统相关研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握离网光伏直流微网的基本架构与能量管理原理;②学习MPPT算法与储能双向充放电控制的协同设计方法;③通过Simulink仿真复现并优化系统性能,应用于科研项目或工程原型开发。; 阅读建议:该资源以Simulink仿真实现为核心,注重理论与实践结合,建议读者在理解控制策略的基础上动手搭建模型,重点关注MPPT模块与储能控制模块的接口逻辑及参数整定,结合实际光照与负荷数据进行仿真测试以深化理解。
内容概要 本资源是一套完整可运行的 Qt Widgets 批量图片压缩桌面工具源码,基于 Qt5/C++ 从零开发,专为初学者设计,分步实现图片批量处理全套功能。工具支持多选单张图片、直接读取整个文件夹内所有 JPG/PNG 图像,可自定义输出图片分辨率、调节 JPG0~100 区间压缩质量,自带锁定宽高比防拉伸变形功能;批量处理完成后自动统计每张图片压缩前后文件体积,计算整体压缩缩小比例,直观展示压缩效果。 适用人群 Qt/C++ 零基础初学者,学习 QImage 图像绘图、文件目录遍历、UI 交互开发; 需要本地批量处理图片的办公、设计、自媒体从业者; 想要学习图片缩放、JPG 压缩、本地文件 IO、进度条交互的开发学习者。 使用场景 自媒体批量压缩配图,降低图片体积节省上传流量; 摄影、设计批量统一图片尺寸,批量轻量化相册图片; 程序开发学习:QFileDialog 文件选择、QDir 文件夹遍历、QImage 缩放保存、QSlider 参数联动、批量循环界面防卡顿、文件大小格式化转换全套 Qt 图像开发实战案例。 工具核心功能清单 双模式导入图片:手动多选单张图片 / 一键读取整个文件夹全部图片; 自定义输出宽高分辨率,支持锁定原始宽高比,避免图片拉伸变形; 滑块调节 JPG 压缩质量 0~100,平衡图片清晰度与文件占用大小; 自定义输出保存目录,批量生成压缩后的图片文件; 实时进度条展示处理进度,循环中刷新界面,程序不会假死卡顿; 自动统计每张图片压缩前后体积,换算 KB/MB 直观展示; 批量完成弹窗汇总:图片总数、成功数量、单张大小对比、整体压缩节省空间比例; 完整模块化代码,功能拆分清晰,每段代码附带详细注释,新手可分步拆解学习。 其他说明 开发环境:Qt Creator + Qt5.15 MSVC,Windows 平台可直接编译运行; 源码结构清晰,功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值