题目大意:
中文题目不用翻译。
说下通俗的题意:M代表等级的权限限制,N代表有N个地方,其中酋长地方的编号永远是第一个编号,所以输入的第一组数据就是酋长的允诺编号为1.
接着有X行能与此地方交换物品和拥有替代品之后的价格。其中P代表这个地方的价值,L代表这个地方的等级。问你怎么用自己的聪明才智使得到达编号1
这个地方的花费最少。
测试实例的走法: 4->2->1 一共花费5250.
解题思路:
建图,dijstra最短路。
注意:
代码:
1 #include <algorithm>
2 #include <iostream>
3 #include <sstream>
4 #include <cstdlib>
5 #include <cstring>
6 #include <cstdio>
7 #include <string>
8 #include <bitset>
9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #include <cmath>
13 #include <list>
14 //#include <map>
15 #include <set>
16 using namespace std;
17 /***************************************/
18 #define ll long long
19 #define int64 __int64
20 /***************************************/
21 const int INF = 0x7f7f7f7f;
22 const double eps = 1e-8;
23 const double PIE=acos(-1.0);
24 const int d1x[]= {0,-1,0,1};
25 const int d1y[]= {-1,0,1,0};
26 const int d2x[]= {0,-1,0,1};
27 const int d2y[]= {1,0,-1,0};
28 const int fx[]= {-1,-1,-1,0,0,1,1,1};
29 const int fy[]= {-1,0,1,-1,1,-1,0,1};
30 /***************************************/
31 void openfile()
32 {
33 freopen("data.in","rb",stdin);
34 freopen("data.out","wb",stdout);
35 }
36 /**********************华丽丽的分割线,以上为模板部分*****************/
37 int lowcost[100],level[100]; //到此地方的最少花费、此地方的等级
38 int vis[100];
39 int map[100][100];
40 int min1;
41 void dijstra(int m,int n)
42 {
43 int i,j,k;
44 int min;
45 min1=INF;
46 for(int lev=level[1]-m; lev<=level[1]; lev++) //枚举等级区间
47 {
48 for(i=1; i<=n; i++)
49 {
50 lowcost[i]=map[0][i];
51 vis[i]=0;
52 }
53 int sum=0;
54 for (j=1; j<=n; j++)
55 if (level[j]<lev||level[j]>lev+m) //把不再此等级范围内的地方标记
56 {
57 vis[j]=1;
58 sum++;
59 }
60 for(i=1; i<=n-1-sum; i++)
61 {
62 j=0;
63 min=INF;
64 for(k=1; k<=n; k++)
65 {
66 if (!vis[k]&&lowcost[k]<min)
67 {
68 min=lowcost[k];
69 j=k;
70 }
71 }
72 vis[j]=1;
73 for(k=1; k<=n; k++)
74 if (!vis[k]&&(map[j][k]+lowcost[j]<lowcost[k]))
75 lowcost[k]=map[j][k]+lowcost[j];
76 }
77 if (lowcost[1]<min1)
78 min1=lowcost[1];
79 }
80 }
81 int main()
82 {
83 int m,n;
84 while(scanf("%d%d",&m,&n)!=EOF)
85 {
86 int i,j;
87 for(i=0; i<=n; i++)
88 for(j=0; j<=n; j++)
89 map[i][j]=INF;
90 for(i=1; i<=n; i++)
91 {
92 int a,b,c;
93 scanf("%d%d%d",&a,&b,&c);
94 level[i]=b;
95 map[0][i]=a;
96 for(j=0; j<c; j++)
97 {
98 int x,val;
99 scanf("%d%d",&x,&val);
100 if (map[i][x]>val) //有向图
101 {
102 // map[i][x]=val;
103 map[x][i]=val;
104 }
105 }
106 }
107 dijstra(m,n);
108 printf("%d\n",min1);
109 }
110 return 0;
111 }
时间: 2024-11-08 22:57:15