最短路(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\n", ans);
85     }
86     
87     return 0;
88 }

 

posted @ 2015-03-27 18:15  Running_Time  阅读(172)  评论(0编辑  收藏  举报