题意:N件物品分别有自己的价值及地位,有些可以被另一件及一个优惠价来替换,选择出的任意两件之间的地位差不超过m,求第一件的最低价;
最开始想用dfs,无情的爆栈了;
强行构图,以每件的价值为点,替换的优惠价为边。遍历每一件物品,把当前物品作为的最低地位(关键),以此选择出符合的点和边,用dijkstra,选出当前情况下第一件物品的最低价,最终比较出所有情况下第一件物品的最低价;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 110
#define INF 0x7ffffff
using namespace std;
int d[N],price[N],pos[N],v[N],e[N][N],n,m;
int dijkstra()
{
for(int i=1;i<=n;i++)
d[i]=price[i];
for(int i=0;i<n;i++)
{
int mmin=INF,t=-1;
for(int j=1;j<=n;j++)
if(!v[j]&&d[j]<mmin)
mmin=d[t=j];
if(t==-1) break;
v[t]=1;
for(int j=1;j<n;j++)
if(!v[j]&&d[j]>d[t]+e[t][j])
d[j]=d[t]+e[t][j];
}
return d[1];
}
int main()
{
while(~scanf("%d%d",&m,&n))
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
e[i][j]=INF;//inti
for(int i=1;i<=n;i++)
{
int x;
scanf("%d%d%d",&price[i],&pos[i],&x);
for(int j=0;j<x;j++)
{
int val,t;
scanf("%d%d",&t,&val);
e[t][i]=val;
}
}
int _min=INF;
for(int i=1;i<=n;i++)
{
memset(v,0,sizeof(v));
for(int j=1;j<=n;j++)
if(pos[j]<pos[i]||pos[j]-pos[i]>m) v[j]=1;
_min=min(dijkstra(),_min);
}
cout<<_min<<endl;
}
}