题目链接:点击打开链接
读入数据后,扫一遍物品,每一遍都根据等级关系标记这个物品是否可以使用,进行一次dijkstra,求出最小花费金币数。
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 105;
int m, n, price[MAXN][MAXN], lv[MAXN], dis[MAXN], x[MAXN];
bool vis[MAXN];
int dijkstra()
{
for(int i = 1; i <= n; ++i)
dis[i] = price[0][i];
int x, y;
for(int i = 1; i <= n; ++i) {
x = 0, y = INF;
for(int j = 1; j <= n; ++j)
if(!vis[j] && y > dis[j]) {
y = dis[j];
x = j;
}
if(!x) break;
vis[x] = true;
for(int j = 1; j <= n; ++j)
if(!vis[j] && price[x][j] > 0 && dis[j] > dis[x] + price[x][j])
dis[j] = dis[x] + price[x][j];
}
return dis[1];
}
int main(int argc, char const *argv[])
{
while(scanf("%d%d", &m, &n) != EOF) {
memset(price, 0, sizeof(price));
memset(lv, 0, sizeof(lv));
memset(dis, 0, sizeof(dis));
memset(x, 0, sizeof(x));
memset(vis, false, sizeof(vis));
for(int i = 1; i <= n; ++i) {
scanf("%d%d%d", &price[0][i], &lv[i], &x[i]);
for(int j = 1; j <= x[i]; ++j) {
int t, u;
scanf("%d%d", &t, &u);
price[t][i] = u;
}
}
int tmp, ans, max_lv;
for(int i = 1; i <= n; ++i) {
max_lv = lv[i];
for(int j = 1; j <= n; ++j)
if(lv[j] > max_lv || max_lv - lv[j] > m) vis[j] = true;
else vis[j] = false;
tmp = dijkstra();
ans = min(ans, tmp);
}
printf("%d\n", ans);
}
return 0;
}