首页 > 代码库 > 【POJ1062】昂贵的聘礼 最短路 题目描述还有数据都坑爹

【POJ1062】昂贵的聘礼 最短路 题目描述还有数据都坑爹

题意:中文题,这里只提供题目传送门 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;
}


复制去Google翻译翻译结果

【POJ1062】昂贵的聘礼 最短路 题目描述还有数据都坑爹