#include "stdio.h"
#include "stdlib.h"
#include "string.h"
const int inf = 0x7fffffff; // 无限大
int M, N;
int dis[101];
int price[101][101];
int L[101]; // 主人的地位等级
int X[101]; // 替代品总数
int bvisit[101];
int dijkstra()
{
int i, j;
for(i = 1; i <= N; i++)
dis[i] = price[0][i];
for (i = 1; i <= N; i++)
{
int node = 0; // dis[]最小
int temp_dis = inf;
// 找出dis[]最小的node
for (j = 1; j <= N; j++)
{
if (!bvisit[j] && temp_dis > dis[j])
{
temp_dis = dis[j];
node = j;
}
}
if(node == 0) // node没有变化,说明所有点都被访问,最短路寻找完毕
break;
bvisit[node] = 1;
// 更新node到其他点的距离
for (j = 1; j <= N; j++)
{
int new_dis = dis[node]+price[node][j];
if (!bvisit[j] && price[node][j] > 0 && dis[j] > new_dis)
{
dis[j] = new_dis;
}
}
}
return dis[1];
}
int main()
{
int i, j;
int temp_price;
int min_price = inf;
int T = 0;
int V = 0;
memset(price, 0, 101);
memset(dis, inf, 101);
memset(L, 0, 101);
memset(bvisit, 1, 101);
scanf("%d %d", &M, &N);
for (i = 1; i <= N; i++)
{
scanf("%d %d %d", &price[0][i], &L[i], &X[i]);
for (j = 1; j <= X[i]; j++)
{
scanf("%d %d", &T, &V);
price[T][i] = V; // 物品i在有第T号替代品情况下的优惠价,即点T到点i的权值
}
}
for(i = 1; i <= N; i++)
{
int maxL = L[i];
for (j = 1; j <= N; j++)
{
if (L[j] > maxL || maxL - L[j] > M)
{
bvisit[j] = 1; // 物品j则强制定义为“已访问”状态,不参与后续操作
}
else
bvisit[j] = 0;
}
temp_price = dijkstra();
if(min_price > temp_price)
min_price = temp_price;
}
printf("%d\n", min_price);
return 0;
}
#include "stdlib.h"
#include "string.h"
const int inf = 0x7fffffff; // 无限大
int M, N;
int dis[101];
int price[101][101];
int L[101]; // 主人的地位等级
int X[101]; // 替代品总数
int bvisit[101];
int dijkstra()
{
int i, j;
for(i = 1; i <= N; i++)
dis[i] = price[0][i];
for (i = 1; i <= N; i++)
{
int node = 0; // dis[]最小
int temp_dis = inf;
// 找出dis[]最小的node
for (j = 1; j <= N; j++)
{
if (!bvisit[j] && temp_dis > dis[j])
{
temp_dis = dis[j];
node = j;
}
}
if(node == 0) // node没有变化,说明所有点都被访问,最短路寻找完毕
break;
bvisit[node] = 1;
// 更新node到其他点的距离
for (j = 1; j <= N; j++)
{
int new_dis = dis[node]+price[node][j];
if (!bvisit[j] && price[node][j] > 0 && dis[j] > new_dis)
{
dis[j] = new_dis;
}
}
}
return dis[1];
}
int main()
{
int i, j;
int temp_price;
int min_price = inf;
int T = 0;
int V = 0;
memset(price, 0, 101);
memset(dis, inf, 101);
memset(L, 0, 101);
memset(bvisit, 1, 101);
scanf("%d %d", &M, &N);
for (i = 1; i <= N; i++)
{
scanf("%d %d %d", &price[0][i], &L[i], &X[i]);
for (j = 1; j <= X[i]; j++)
{
scanf("%d %d", &T, &V);
price[T][i] = V; // 物品i在有第T号替代品情况下的优惠价,即点T到点i的权值
}
}
for(i = 1; i <= N; i++)
{
int maxL = L[i];
for (j = 1; j <= N; j++)
{
if (L[j] > maxL || maxL - L[j] > M)
{
bvisit[j] = 1; // 物品j则强制定义为“已访问”状态,不参与后续操作
}
else
bvisit[j] = 0;
}
temp_price = dijkstra();
if(min_price > temp_price)
min_price = temp_price;
}
printf("%d\n", min_price);
return 0;
}