昂貴的聘禮
Time Limit: 1000MS |
|
Memory Limit: 10000K |
Total Submissions: 23885 |
|
Accepted: 6632 |
Description
年輕的探險家來到了一個印第安部落里。在那里他和酋長的女兒相愛了,于是便向酋長去求親。酋長要他用10000個金幣作為聘禮才答應(yīng)把女兒嫁給他。探險家拿不出這么多金幣,便請求酋長降低要求。酋長說:"嗯,如果你能夠替我弄到大祭司的皮襖,我可以只要8000金幣。如果你能夠弄來他的水晶球,那么只要5000金幣就行了。"探險家就跑到大祭司那里,向他要求皮襖或水晶球,大祭司要他用金幣來換,或者替他弄來其他的東西,他可以降低價格。探險家于是又跑到其他地方,其他人也提出了類似的要求,或者直接用金幣換,或者找到其他東西就可以降低價格。不過探險家沒必要用多樣東西去換一樣東西,因為不會得到更低的價格。探險家現(xiàn)在很需要你的幫忙,讓他用最少的金幣娶到自己的心上人。另外他要告訴你的是,在這個部落里,等級觀念十分森嚴。地位差距超過一定限制的兩個人之間不會進行任何形式的直接接觸,包括交易。他是一個外來人,所以可以不受這些限制。但是如果他和某個地位較低的人進行了交易,地位較高的的人不會再和他交易,他們認為這樣等于是間接接觸,反過來也一樣。因此你需要在考慮所有的情況以后給他提供一個最好的方案。
為了方便起見,我們把所有的物品從1開始進行編號,酋長的允諾也看作一個物品,并且編號總是1。每個物品都有對應(yīng)的價格P,主人的地位等級L,以及一系列的替代品Ti和該替代品所對應(yīng)的"優(yōu)惠"Vi。如果兩人地位等級差距超過了M,就不能"間接交易"。你必須根據(jù)這些數(shù)據(jù)來計算出探險家最少需要多少金幣才能娶到酋長的女兒。
Input
輸入第一行是兩個整數(shù)M,N(1 <= N <= 100),依次表示地位等級差距限制和物品的總數(shù)。接下來按照編號從小到大依次給出了N個物品的描述。每個物品的描述開頭是三個非負整數(shù)P、L、X(X < N),依次表示該物品的價格、主人的地位等級和替代品總數(shù)。接下來X行每行包括兩個整數(shù)T和V,分別表示替代品的編號和"優(yōu)惠價格"。
Output
輸出最少需要的金幣數(shù)。
Sample Input
1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
3000 2 1
4 200
50 2 0
Sample Output
5250
很顯然構(gòu)圖成求最短路的問題
開始寫了dijkstra,調(diào)了半天沒過,wa了好多次,糾結(jié)了,寫spfa過的
1
#include<stdio.h>
2
#include<string.h>
3
#include<math.h>
4
#define M 2100000000
5
#define MAX 100
6
int map[MAX+5][MAX+5];
7
int level[MAX+5],w[MAX+5];
8
int n,m;//等級限制m
9
//int ss[MAX+5];
10
int min(int a,int b)
11

{
12
if (a<b) return a;
13
else return b;
14
}
15
int spfa(int base)
16

{
17
int xxx;
18
int q[100000];
19
int dist[MAX+5];
20
short v[MAX+5];
21
int i;
22
int head,tail,sum,now;
23
head=0;tail=1;
24
q[tail]=1;
25
memset(v,0,sizeof(v));v[1]=1;
26
for (i=1;i<=n ;i++ ) dist[i]=M;
27
dist[1]=0;
28
while (head!=tail)
29
{
30
head=head+1;
31
now=q[head];
32
for (i=1;i<=n ;i++ )
33
if (map[now][i]<M&&(level[i]>=base&&level[i]<=base+m)&&dist[i]>dist[now]+map[now][i])
34
{
35
dist[i]=dist[now]+map[now][i];
36
if (!v[i])
37
{
38
tail++;
39
q[tail]=i;
40
v[i]=1;
41
}
42
}
43
v[now]=0;
44
}
45
xxx=M+1;
46
for (i=1;i<=n ;i++ )
47
if (level[i]>=base&&level[i]<=base+m)
48
{
49
xxx=min(xxx,dist[i]+w[i]);
50
}
51
return xxx;
52
}
53
int main()
54

{
55
int i,j,x,ans;
56
int sec,data;
57
for (i=0; i<MAX+5 ; i++ )
58
for (j=0; j<MAX+5 ; j++)
59
map[i][j]=M;
60
scanf("%d%d",&m,&n);
61
for (i=1; i<=n ; i++ )
62
{
63
scanf("%d%d%d",&w[i],&level[i],&x);
64
for (j=1; j<=x ; j++ )
65
{
66
scanf("%d%d",&sec,&data);
67
map[i][sec]=data;
68
}
69
}
70
ans=M;
71
for (i=level[1]-m; i<=level[1]; i ++)
72
ans=min(ans,spfa(i));
73
printf("%d\n",ans);
74
return 0;
75
}
76