侧边栏

计蒜客-A1594 封印之门

链接:https://nanti.jisuanke.com/t/A1594

思路:Floyd求最短路模板题,最后把两串对应字符间最短路相加即可,注意输入时两个相同字符不需要考虑,inf设为0x7ffffff防止爆int

代码:

 1 #include<bits/stdc++.h>
 2 #define inf 0x7ffffff
 3 #define ms(a) memset(a,0,sizeof(a))
 4 using namespace std;
 5 typedef long long ll;
 6 
 7 const int M = int(1e5) + 5;
 8 const int mod = int(1e9) + 7;
 9 
10 int dis[26][26];
11 void floyd(){
12     for(int k=0;k<26;k++){
13         for(int i=0;i<26;i++){
14             for(int j=0;j<26;j++){
15                 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
16             }
17         }
18     }
19 }
20 int main(){
21     for(int i=0;i<26;i++){
22         for(int j=0;j<26;j++){
23             if(i==j) dis[i][j]=0;
24             else dis[i][j]=inf;
25         }
26     }
27     string a,b;
28     cin>>a>>b;
29     int k;
30     cin>>k;
31     for(int i=0;i<k;i++){
32         char c,d;
33         cin>>c>>d;
34         if(c!=d)
35         dis[c-'a'][d-'a']=1;
36     }
37     floyd();
38     int ans=0;
39     for(int i=0;i<a.size();i++){
40         if(dis[a[i]-'a'][b[i]-'a']==inf){
41             cout<<-1<<endl;
42             return 0;
43         }
44         else ans+=dis[a[i]-'a'][b[i]-'a'];
45     }
46     cout<<ans<<endl;
47     return 0;
48 }

 

posted @ 2020-04-24 22:21  晴人  阅读(273)  评论(0编辑  收藏  举报