zoukankan      html  css  js  c++  java
  • ZOJ-2750 Idiomatic Phrases Game---Dijk最短路

    题目链接:

    https://vjudge.net/problem/ZOJ-2750

    题目大意:

    给定一本字典,字典里有很多成语,要求从字典里的第一个成语开始,运用字典里的成语变到最后一个成语,变得过程就是成语接龙,后一个成语的第一个字必须有前一个成语的最后一个字相等,给定的成语是4位16进制数字,每个成语前边跟的数字代表着找到这个成语之后再找到下个成语还需要t分钟 。(这里是找到该成语后还需要时间t,才能找到下一个成语)

    思路:

    每个成语有前面四个字符和后面四个字符,如果第i个成语后面字符等于第j个成语前面四个字符,那么这中间的消耗就是第i个成语自带的消耗T,按照这个原理就可以建图啦。然后用dijkstra求出从第一个成语到其他各个成语的最短路,然后判断最后一个成语是否可达,可达就输出d[n],不能就输出-1

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #include<stack>
     8 #include<map>
     9 #include<sstream>
    10 using namespace std;
    11 typedef long long ll;
    12 const int maxn = 1000 + 10;
    13 const int INF = 1 << 25;
    14 int T, n, m, cases;
    15 int Map[maxn][maxn];
    16 bool v[maxn];
    17 int d[maxn];
    18 void dijkstra(int u0)
    19 {
    20     memset(v, 0, sizeof(v));
    21     for(int i = 1; i <= n; i++)d[i] = (i == u0 ? 0 : INF);
    22     for(int i = 1; i <= n; i++)
    23     {
    24         int x, m = INF;
    25         for(int j = 1; j <= n; j++)if(!v[j] && d[j] <= m)m = d[x = j];
    26         v[x] = 1;
    27         for(int j = 1; j <= n; j++)
    28             d[j] = min(d[j], d[x] + Map[x][j]);//松弛操作
    29     }
    30 }
    31 struct node
    32 {
    33     string s1, s2;
    34     int time;
    35 };
    36 node a[maxn];
    37 int main()
    38 {
    39     while(cin >> n && n)
    40     {
    41         string s;
    42         int x;
    43         for(int i = 1; i <= n; i++)
    44         {
    45             cin >> x >> s;
    46             a[i].time = x;
    47             a[i].s1 = a[i].s2 = "";
    48             for(int j = 0, k = s.size() - 4; j < 4; j++, k++)
    49             {
    50                 a[i].s1 += s[j];
    51                 a[i].s2 += s[k];
    52             }
    53             //cout<<a[i].s1<<" "<<a[i].s2<<endl;
    54         }
    55         for(int i = 1; i <= n; i++)//建图
    56         {
    57             for(int j = 1; j <= n; j++)
    58             {
    59                 Map[i][j] = INF;
    60                 if(i == j)continue;
    61                 if(a[i].s2 == a[j].s1)Map[i][j] = a[i].time;
    62             }
    63         }
    64         dijkstra(1);
    65         if(d[n] >= INF)cout<<"-1"<<endl;
    66         else cout<<d[n]<<endl;
    67     }
    68     return 0;
    69 }
  • 相关阅读:
    (转载)如何通过Nicholas C. Zakas的面试
    (转载)Nicholas C. Zakas谈怎样才能成为优秀的前端工程师
    JavaScript程序开发(十三)—RegExp类型
    (转载)Nicholas C. Zakas如何面试前端工程师
    通用JS12——》变量、作用域与内存
    vuecli4 配置多页应用入坑详解
    事件委托
    nodejs中传入变量和格式说明符号来格式化用语
    原生js实现轮播图
    同步任务和异步任务
  • 原文地址:https://www.cnblogs.com/fzl194/p/8728315.html
Copyright © 2011-2022 走看看