Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 51064 | Accepted: 15289 |
Description
爲了方便起見,我們把所有的物品從1開始進行編號,酋長的允諾也看作一個物品,並且編號總是1。每個物品都有對應的價格P,主人的地位等級L,以及一系列的替代品Ti和該替代品所對應的"優惠"Vi。如果兩人地位等級差距超過了M,就不能"間接交易"。你必須根據這些數據來計算出探險家最少需要多少金幣才能娶到酋長的女兒。
Input
Output
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
Source
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const int MAX = 105;
struct Edge{
int k;
int w;
Edge(int kk, int ww)
: k(kk), w(ww){
}
Edge(){
};
}temp;
bool operator < (const Edge& e1, const Edge& e2){
return e1.w > e2.w;
}
int used[MAX];
int level[MAX];
int valid[MAX];
int m, n;
vector <Edge> G[MAX];
int dijk(){
memset(used,0,sizeof(used));
priority_queue<Edge> pq;
temp.k = 0;
temp.w = 0;
pq.push(temp);
while(!pq.empty()){
temp = pq.top();
pq.pop();
if(used[temp.k])
continue;
used[temp.k] = 1;
if(temp.k == 1)
break;
for(int i = 0 , j =G[temp.k].size() ;i <j ;++i){
Edge q;
q.k = G[temp.k][i].k;
if(used[q.k]) continue;
q.w = temp.w + G[temp.k][i].w;
if(valid[q.k])
pq.push(q);
}
}
return temp.w;
}
int main()
{
cin >> m >> n;
int p, l, x;
int t, v;
for(int z = 1;z <= n; ++z){
cin >> p >> l >> x;
level[z] = l;
G[0].push_back(Edge(z,p));
for(int i = 0;i < x; ++i){
cin >> t >> v;
G[t].push_back(Edge(z,v));
}
}
int leader = level[1];
int Min = 0x3f3f3f3f;
for(int i = 0;i <= m; ++i){
memset(valid,0,sizeof(valid));
for(int j = 1;j <= n; ++j){
if(level[j] >= leader - m + i && level[j] <= leader + i)
valid[j] = 1;
}
Min = min(Min, dijk());
}
cout << Min<< "\n";
}