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/archive/2013/04/01/2992926.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值