POJ 1062 昂贵的聘礼
解题思路:首先添加一个超级原点0,到各个点的距离分别为各物品的价格,从0点出发,找到到达1点的最短路径
枚举所有等级区间
#include <iostream>
using namespace std;
#define MaxNum 1e8
int main()
{
int edge[105][105];
fill(&edge[0][0], &edge[104][104], MaxNum);
int level[105];
int M ,N, P, L ,X, T, V, minDist;
cin >> M >> N;
for (int i = 1; i <= N; i++)
{
cin >> P >> L >> X;
edge[0][i] = P;
level[i] = L;
for(int j = 0; j < X; j++)
{
cin >> T >> V;
edge[T][i] = V;
}
}
int MaxLevel = level[1] + M;
bool *visited = new bool[N + 1];
int *dist = new int[N + 1];
int shortest = MaxNum;
for (int lev = level[1]; lev <= MaxLevel; lev++)
{
int start = 0, tempS;
memset(visited, 0, sizeof(bool) * (N + 1));
fill(&dist[0], &dist[N + 1], MaxNum);
visited[0] = true;
dist[0] = 0;
for (int i = 0; i < N; i++)
{
minDist = MaxNum;
for(int j = 1; j <= N; j++)
if (!visited[j] && level[j] <= lev && level[j] >= (lev - M))
{
if (dist[j] > (edge[start][j] + dist[start]))
dist[j] = edge[start][j] + dist[start];
if (minDist > dist[j])
{
minDist = dist[j];
tempS = j;
}
}
else
visited[j] = true;
start = tempS;
visited[start] = true;
if (start == 1)
break;
}
if (shortest > dist[1])
shortest = dist[1];
}
delete []visited;
delete []dist;
cout << shortest << endl;
return 0;
}