import java.util.*; public class Main { private static Scanner in; static String[] head = new String[1000];//记录一个成语的头 static String[] tail = new String[1000];//记录一个成语的尾 static int[] time = new int[1000];//记录一个成语找到下一个成语的时间 static int[][] g = new int[1000][1000];//记录第i个成语找到第j个成语的时间 static int[] min = new int [1000]; static int n; public static void main(String[] args) { in = new Scanner(System.in); int len,i,k,h; String str; //对于每一组测试数据 while(in.hasNext()) { n=in.nextInt(); if(n==0) break; for( i=0;i<n;i++) { time[i]=in.nextInt(); str=in.next(); len=str.length(); head[i]="" + str.charAt(0)+str.charAt(1)+str.charAt(2)+str.charAt(3); tail[i]="" + str.charAt(len-4)+str.charAt(len-3)+str.charAt(len-2)+str.charAt(len-1); } //记录第i个成语找到第j个成语的时间 for(k=0;k<n;k++) { for( h=0;h<n;h++) { if((head[k].equals(tail[h]))){ g[h][k]=time[h]; } else { g[h][k] = 1000000000; } } } //调用Dijkstra最短路径算法 dist(); if(min[n-1]==1000000000){ System.out.println(-1); } else { System.out.println(min[n-1]); } } } public static void dist(){ int[] v=new int[n]; int d,k,i,j,h; for(i=0;i<n;i++) { min[i]=1000000000; v[i]=0; } min[0]=0; //每一次循环,加入一个结点到v for(j=0;j<n;j++) { //找出从第一个成语到下一个成语的最短路径 for(d=-1,k=0;k<n;k++) if(v[k]==0&&(d==-1||min[k]<min[d])) { d=k; } //更新与d直接相邻顶点的dist值 for(v[d]=1,h=0;h<n;h++) { if(v[h]==0&&((min[d]+g[d][h])<min[h])){ min[h]=min[d]+g[d][h]; } } } } } /************************************************************** Problem: 2134 User: admin Language: Java Result: Accepted Time:1293 ms Memory:53412 kb ****************************************************************/