开始有一个串 变成 要求的串的最小花费
建个图。。。。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define clr(x)memset(x,0,sizeof(x))
#define maxint 0x1f1f1f1f
int abs(int x){
if(x>=0)return x;
else return -x;
}
int dist[200];
int c[200][200];
void dijkstra(int n,int v)
{
int s[10000];
int i,j,tmp,u,newdist;
clr(s);
for(i=1;i<=n;i++)
dist[i]=c[v][i];
dist[v]=0;
s[v]=1;
for(i=1;i<n;i++)
{
tmp=maxint;
u=v;
for(j=1;j<=n;j++)
if(!s[j]&&dist[j]<tmp)
{
u=j;
tmp=dist[j];
}
s[u]=1;
for(j=1;j<=n;j++)
if(!s[j]&&c[u][j]<maxint)
{
newdist=dist[u]+c[u][j];
dist[j]=(newdist<dist[j])?newdist:dist[j];
}
}
}
struct node {
char s[200];
int m;
}q[200];
int main()
{
int n,st,i,j;
char en[200];
while(scanf("%d",&n)!=EOF){
for(i=1;i<=n;i++){
scanf("%s",&q[i].s);
scanf("%d",&q[i].m);
}
scanf("%d",&st);
scanf("%s",en);
memset(c,maxint,sizeof(c));
for(i=1;i<=n;i++)
dist[i]=maxint;
for(i=1;i<=n;i++){
for(j=i+1;j<=n;j++){
int t1=maxint;
int t2=maxint;
int t3=maxint;
if(strcmp(q[i].s,q[j].s)==0)t1=0;
if(q[i].m==q[j].m&&strcmp(q[i].s,q[j].s)!=0){
int sum=0;
int len1=strlen(q[i].s);
int len2=strlen(q[j].s);
int len=min(len1,len2);
for(int k=0;k<len;k++){
sum+=abs(q[i].s[k]-q[j].s[k]);
}
t2=sum;
}
if(q[i].m!=q[j].m&&strcmp(q[i].s,q[j].s)!=0){
int sum=0;
int len1=strlen(q[i].s);
int len2=strlen(q[j].s);
int len=min(len1,len2);
for(int k=0;k<len;k++){
sum+=abs(q[i].s[k]-q[j].s[k]);
}
t3=sum*(q[i].m+q[j].m);
}
c[j][i]=c[i][j]=min(t1,min(t2,t3));
}
}
for(i=1;i<=n;i++)
c[i][i]=0;
dijkstra(n,st);
int res=maxint;
for(i=1;i<=n;i++)
{
if(strcmp(q[i].s,en)==0)res=min(res,dist[i]);
}
if(res>=maxint)printf("Oh No!\n");
else printf("%d\n",res);
}
return 0;
}