• 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 }
  • 相关阅读:
    docker运行爬虫代码
    python语法之流程控制(if while for)
    python基本数据类型
    python基本运算符
    python用户交互与格式化输出
    jieba模块基本介绍
    wordcloud库基本介绍
    计算机基础之编程语言
    计算机基础
    python入门之流程控制
  • 原文地址:https://www.cnblogs.com/allh123/p/2992926.html
Copyright © 2020-2023  润新知