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;
}

 

posted on 2010-11-04 16:14  ltang  阅读(294)  评论(0编辑  收藏  举报

导航