题意:中文题,这里只提供题目传送门 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; }
【POJ1062】昂贵的聘礼 最短路 题目描述还有数据都坑爹
原文地址:http://blog.csdn.net/vmurder/article/details/40685025