/*
枚举等级范围, 每种情况求最短路
*/
#include <iostream>
#include <queue>
#define MAXN 101
using namespace std;
int MAP[MAXN][MAXN];
int D[MAXN];
int LEV;
int p[MAXN], l[MAXN];
int e[10000][3];
int bellman(int s, int t, int n)
{
bool mk[MAXN] = {false};
queue<int> q;
int i, x, tmp;
for (D[s] = 0, q.push(s); !q.empty(); )
for (x = q.front(), q.pop(), mk[x] = false, i = 0; i < n; i++)
if (MAP[x][i] != INT_MAX && (tmp = D[x] + MAP[x][i]) < D[i])
{
D[i] = tmp;
if (!mk[i])
mk[i] = true, q.push(i);
}
return D[t];
}
int main()
{
int n, i, j, m, w, cur = 0;
int x, y;
int king, lev;
int cost, min_cost;
scanf("%d %d", &LEV, &n);
for (i = 0; i <= n; i++)
MAP[i][0] = INT_MAX;
for (i = 1; i <= n; i++)
{
scanf("%d %d %d", &p[i], &l[i], &m);
while (m--)
{
scanf("%d %d", &j, &w);
e[cur][0] = i;
e[cur][1] = j;
e[cur][2] = w;
cur++;
}
MAP[i][0] = p[i];
}
king = l[1];
min_cost = p[1];
for (lev = king - LEV; lev <= king; lev++)
{
for (i = 0; i <= n; i++)
for (D[i] = INT_MAX, j = 1; j <= n; j++)
MAP[i][j] = INT_MAX;
for (i = 0; i < cur; i++)
{
x = e[i][0];
y = e[i][1];
if (l[x] >= lev && l[x] <= lev+LEV
&& l[y] >= lev && l[y] <= lev+LEV)
MAP[x][y] = e[i][2];
}
cost = spfa(1, 0, n+1);
if (cost < min_cost)
min_cost = cost;
}
printf("%d\n", min_cost);
return 0;
}
枚举等级范围, 每种情况求最短路
*/
#include <iostream>
#include <queue>
#define MAXN 101
using namespace std;
int MAP[MAXN][MAXN];
int D[MAXN];
int LEV;
int p[MAXN], l[MAXN];
int e[10000][3];
int bellman(int s, int t, int n)
{
bool mk[MAXN] = {false};
queue<int> q;
int i, x, tmp;
for (D[s] = 0, q.push(s); !q.empty(); )
for (x = q.front(), q.pop(), mk[x] = false, i = 0; i < n; i++)
if (MAP[x][i] != INT_MAX && (tmp = D[x] + MAP[x][i]) < D[i])
{
D[i] = tmp;
if (!mk[i])
mk[i] = true, q.push(i);
}
return D[t];
}
int main()
{
int n, i, j, m, w, cur = 0;
int x, y;
int king, lev;
int cost, min_cost;
scanf("%d %d", &LEV, &n);
for (i = 0; i <= n; i++)
MAP[i][0] = INT_MAX;
for (i = 1; i <= n; i++)
{
scanf("%d %d %d", &p[i], &l[i], &m);
while (m--)
{
scanf("%d %d", &j, &w);
e[cur][0] = i;
e[cur][1] = j;
e[cur][2] = w;
cur++;
}
MAP[i][0] = p[i];
}
king = l[1];
min_cost = p[1];
for (lev = king - LEV; lev <= king; lev++)
{
for (i = 0; i <= n; i++)
for (D[i] = INT_MAX, j = 1; j <= n; j++)
MAP[i][j] = INT_MAX;
for (i = 0; i < cur; i++)
{
x = e[i][0];
y = e[i][1];
if (l[x] >= lev && l[x] <= lev+LEV
&& l[y] >= lev && l[y] <= lev+LEV)
MAP[x][y] = e[i][2];
}
cost = spfa(1, 0, n+1);
if (cost < min_cost)
min_cost = cost;
}
printf("%d\n", min_cost);
return 0;
}