• 最短路(Dijkstra) POJ 1062 昂贵的聘礼


    题目传送门

     1 /*
     2     最短路:Dijkstra算法,首先依照等级差距枚举“删除”某些点,即used,然后分别从该点出发生成最短路
     3             更新每个点的最短路的最小值
     4     注意:国王的等级不一定是最高的:)
     5 */
     6 #include <cstdio>
     7 #include <iostream>
     8 #include <algorithm>
     9 #include <cmath>
    10 #include <map>
    11 #include <vector>
    12 #include <cstring>
    13 #include <string>
    14 using namespace std;
    15 
    16 const int MAXN = 1e2 + 10;
    17 const int INF = 0x3f3f3f3f;
    18 
    19 int d[MAXN];
    20 int cost[MAXN][MAXN];
    21 int x[MAXN];
    22 int lv[MAXN];
    23 int used[MAXN];
    24 
    25 int Dijkstra(int n)
    26 {
    27     for (int i=1; i<=n; ++i)    d[i] = cost[0][i];
    28 
    29     for (int i=1; i<=n; ++i)
    30     {
    31         int x = 0;
    32         int mn = INF;
    33         for (int j=1; j<=n; ++j)
    34         {
    35             if (!used[j] && d[j] < mn)        mn = d[x=j];
    36         }
    37         if (x == 0)        break;
    38         used[x] = 1;
    39         for (int j=1; j<=n; ++j)
    40         {
    41             if (!used[j] && cost[x][j] > 0)
    42                 d[j] = min (d[j], d[x] + cost[x][j]);
    43         }
    44     }
    45 
    46     return d[1];
    47 }
    48 
    49 int main(void)        //POJ 1062 昂贵的聘礼
    50 {
    51     //freopen ("C.in", "r", stdin);
    52 
    53     int n, m;
    54 
    55     while (~scanf ("%d%d", &m, &n))
    56     {
    57         memset (used, 0, sizeof (used));
    58         memset (d, 0, sizeof (d));
    59         memset (cost, 0, sizeof (cost));
    60         for (int i=1; i<=n; ++i)
    61         {
    62             scanf ("%d%d%d", &cost[0][i], &lv[i], &x[i]);
    63             for (int j=1; j<=x[i]; ++j)
    64             {
    65                 int t, u;
    66                 scanf ("%d%d", &t, &u);
    67                 cost[t][i] = u;
    68             }
    69         }
    70 
    71         int tmp, ans = INF, maxlv;
    72         for (int i=1; i<=n; ++i)
    73         {
    74             maxlv = lv[i];
    75             for (int j=1; j<=n; ++j)
    76             {
    77                 if (lv[j] > maxlv || maxlv - lv[j] > m)        used[j] = 1;
    78                 else        used[j] = 0;
    79             }
    80             tmp = Dijkstra (n);
    81             ans = min (ans, tmp);
    82         }
    83 
    84         printf ("%d
    ", ans);
    85     }
    86     
    87     return 0;
    88 }
    编译人生,运行世界!
  • 相关阅读:
    电子邮件为什么要编码以及产生乱码的原因?
    UTF8国际通用为什么还要用GBK?
    python 调用shell命令的方法
    script —— 终端里的记录器
    IP数据报是如何在网络中转发的?
    网际协议:无连接数据报交付(IPv4)
    fork与vfork
    strlen与sizeof有什么区别?
    网络地址到物理地址的映射(ARP)
    分类的因特网地址
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4372574.html
Copyright © 2020-2023  润新知