题意:中文题,这里只提供题目传送门 http://poj.org/problem?id=1062
题解:首先若物品1可以由物品2加上x元得到,连一条B -> A的单向边,边权为x。
然后源点向每个物品连一条物品直接价格的边。
然后枚举点权的下限和上限。
好吧,很水。但是数据范围坑爹!!!点权还能是0!!而且酋长等级不一定最高!!
贴代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 200
#define inf 0x3f3f3f3f
using namespace std;
struct KSD
{
int v,len,next;
}e[N*N<<1];
int head[N],cnt;
void add(int u,int v,int len)
{
cnt++;
e[cnt].v=v;
e[cnt].len=len;
e[cnt].next=head[u];
head[u]=cnt;
}
int n,nwl,ans=inf;/*node-weighted limit*/
int dist[N],nw[N],visit[N];
int dij(int s,int t,int dnwl,int unwl)
{
memset(dist,0x3f,sizeof(dist));
memset(visit,0,sizeof(visit));
int i,j,u,uw,v;
dist[s]=0;
for(i=1;i<=n;i++)
{
uw=inf+1;
for(j=0;j<=n;j++)
{
if(!visit[j]&&uw>dist[j])
{
uw=dist[j];
u=j;
}
}
if(u==t)return dist[t];
visit[u]=1;
for(j=head[u];j;j=e[j].next)
{
v=e[j].v;
if(nw[v]<dnwl||nw[v]>unwl)continue;
dist[v]=min(dist[v],dist[u]+e[j].len);
}
}
return dist[t];
}
int main()
{
// freopen("test.in","r",stdin);
int i,j;
int a,b,c;
scanf("%d%d",&nwl,&n);
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(0,i,a);
nw[i]=b;
for(j=1;j<=c;j++)
{
scanf("%d%d",&a,&b);
add(a,i,b);
}
}
for(i=max(0,nw[1]-nwl);i<=nw[1];i++)
{
ans=min(ans,dij(0,1,i,i+nwl));
}
printf("%d\n",ans);
return 0;
}