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 }
原文地址:https://www.cnblogs.com/allh123/p/2992926.html