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<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define inf 1000000000
using namespace std;
const int maxn=100010;
queue<int>q;
int num,pre[maxn*2],other[maxn*2],last[maxn],w[maxn*2],dis[maxn];
bool vis[maxn],can[maxn];
struct node{
int p,l,x,a[1010],b[1010];
}a[maxn];
void add(int x,int y,int z){
num++;
pre[num]=last[x];
last[x]=num;
other[num]=y;
w[num]=z;
}
void spfa(){
memset(vis,0,sizeof(vis));
memset(dis,127,sizeof(dis));
q.push(0);
dis[0]=0;
vis[0]=1;
while(!q.empty()){
int t=q.front();
q.pop();
vis[t]=0;
for(int i=last[t];i;i=pre[i]){
int v=other[i];
if(can[v]&&(dis[v]>dis[t]+w[i]||a[v].p<dis[v])){
dis[v]=min(a[v].p,dis[t]+w[i]);
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
}
int main(){
int n,m,minn=0,ans=inf;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a[i].p,&a[i].l,&a[i].x);
for(int j=1;j<=a[i].x;j++)
scanf("%d%d",&a[i].a[j],&a[i].b[j]);
}
for(int i=1;i<=m;i++){
for(int j=1;j<=a[i].x;j++)
add(a[i].a[j],i,a[i].b[j]);
}
for(int i=1;i<=m;i++)
add(0,i,a[i].p);
for(int j=1;j<=m;j++){
minn=a[j].l;//把這個數當成最小
//memset(can,0,sizeof(can));
for(int k=1;k<=m;k++){
if(minn>a[k].l||minn+n<a[k].l) can[k]=false;
else can[k]=1;
}
spfa();
ans=min(ans,dis[1]);
}
printf("%d\n",ans);
return 0;
}