理解了题不难
#include <iostream>
#include <cstring>
#include <cstdio>
#define inf 99999999
using namespace std;
int map[1005][1005];
char dic[1005][1000];
int w[1005];
int vis[1005];
int d[1005];
int n;
int dijkstra()
{
memset(vis,0,sizeof(vis));
int i;
for(i=0;i<n;i++)
d[i]=inf;
d[0]=0;
for(i=0;i<n;i++)
{
int y,x,m=inf;
for(y=0;y<n;y++)
if(!vis[y]&&d[y]<=m)
{
m=d[y];
x=y;
}
vis[x]=1;
for(y=0;y<n;y++)
{
if(map[x][y]!=-1&&(d[y]>d[x]+map[x][y]))
{
d[y]=d[x]+map[x][y];
}
}
}
return d[n-1];
}
int main()
{
while(scanf("%d",&n),n)
{
int i;
memset(dic,0,sizeof(dic));
memset(w,0,sizeof(w));
for(i=0;i<n;i++)
scanf("%d%s",&w[i],dic[i]);
int j;
memset(map,-1,sizeof(map));
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
continue;
int l1=strlen(dic[i]);
int k;
for(k=0;k<4;k++)
{
if(dic[i][l1-4+k]!=dic[j][k])
break;
}
if(k==4)
{
map[i][j]=w[i];
}
}
}
int res=dijkstra();
if(res==inf)
printf("-1\n");
else
printf("%d\n",res);
}
return 0;
}