Idiomatic Phrases Game zoj 2750 Dijkstra
典型的Dijkstra,按题目要求构造出对应的图,找从第一个成语到最后一个成语的最短路,在中间找第一个成语到其他成语的最小用时时没有找到,所有未选中的成语的用时都是INF,那么就输出-1,如果找出的是最后一个成语了,就berak,输出min值。
在读用时和成语字符串时,我写了个scanf("%d %s",&num[i],a[i]); 其中char a[MAXN][50],然后WA了,我就改成了 char a[MAXN][100],scanf("%d",&num[i]);scanf("%s",a[i]);然后及AC了。
贴代码:
View Code
1 #include <cstdio> 2 #include <cstring> 3 #define INF 1000000 4 #define MAXN 1005 5 int edge[MAXN][MAXN]; 6 int time[MAXN]; 7 bool s[MAXN]; 8 int n; 9 bool isConnected(char a[],char b[]) 10 { 11 int len = strlen(a); 12 if(a[len-4] == b[0] && a[len-3] == b[1] && a[len-2] == b[2] && a[len-1] == b[3]) 13 return true; 14 else 15 return false; 16 } 17 void Dijkstra(int uo,int u1) 18 { 19 int i,j; 20 memset(s,false,sizeof(s)); 21 s[uo] = true; 22 for(i=0; i<n; i++) 23 time[i] = edge[uo][i]; 24 for(i=1; i<n; i++) 25 { 26 int min = INF; 27 int v = -1; 28 for(j=0; j<n; j++) 29 { 30 if(!s[j] && time[j] < min) 31 { 32 min = time[j]; 33 v = j; 34 } 35 } 36 if(v == u1) 37 { 38 printf("%d\n",min); 39 break; 40 } 41 if(v == -1) 42 { 43 printf("-1\n"); 44 break; 45 } 46 s[v] = true; 47 for(j=0; j<n; j++) 48 { 49 if(!s[j] && edge[v][j] < INF && time[v] + edge[v][j] < time[j]) 50 time[j] = time[v] +edge[v][j]; 51 } 52 } 53 } 54 int main() 55 { 56 // freopen("in.cpp","r",stdin); 57 int num[MAXN]; 58 char a[MAXN][100]; 59 while(~scanf("%d",&n) && n != 0) 60 { 61 int i,j; 62 for(i=0; i<n; i++) 63 { 64 scanf("%d",&num[i]); 65 scanf("%s",a[i]); 66 } 67 for(i=0; i<n; i++) 68 { 69 for(j=0; j<n; j++) 70 { 71 if(i == j ) 72 { 73 edge[i][j] = INF; 74 continue; 75 } 76 if(isConnected(a[i],a[j])) edge[i][j] = num[i]; 77 else edge[i][j] = INF; 78 } 79 } 80 Dijkstra(0,n-1); 81 } 82 return 0; 83 }