poj1062 Bellman 最短路应用

昂贵的聘礼

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 41066   Accepted: 11959

Description

年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。另外他要告诉你的是,在这个部落里,等级观念十分森严。地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。因此你需要在考虑所有的情况以后给他提供一个最好的方案。

为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。

Input

输入第一行是两个整数M,N(1 <= N <= 100),依次表示地位等级差距限制和物品的总数。接下来按照编号从小到大依次给出了N个物品的描述。每个物品的描述开头是三个非负整数P、L、X(X < N),依次表示该物品的价格、主人的地位等级和替代品总数。接下来X行每行包括两个整数T和V,分别表示替代品的编号和"优惠价格"。

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<cstdlib>
#include<cmath>
#define INF 200000000

using namespace std;

struct node
{
    int u,v,w;
} edge[10000];
int num=0;
int N,M;
int P[2000],L[2000],n[2000];
int t,v;
int low[2000],a,b;
int has[2000] ;
int Bellman(int u0)
{
    for(int i=0; i<=N; i++)
        low[i]=INF;

    low[u0]=0;
    for(int i=0; i<N-1; i++)
    {
        int flag=0;
        for(int j=0; j<num; j++)
        {
            if(has[edge[j].u]&&has[edge[j].v]&&low[edge[j].u]+edge[j].w<low[edge[j].v])
            {
                low[edge[j].v]=low[edge[j].u]+edge[j].w;
                flag=1;
            }
        }
        if(flag==0)
            break;
    }

    int Min=INF;
    for(int i=1; i<=N; i++)
    {
        low[i]+=P[i];        //最小价格为优惠价+拥有优惠价需要花多少钱
        if(Min>low[i])
            Min=low[i];
    }
    //printf("%d\n",Min);
    return Min;
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d%d",&M,&N))
    {
    	num=0;
        for(int i=1; i<=N; i++)
        {
            scanf("%d%d%d",&P[i],&L[i],&n[i]);
            for(int j=1; j<=n[i]; j++)
            {
			    int a,b;
                scanf("%d%d",&a,&b);
                edge[num].u=i;
				edge[num].v=a;
				edge[num++].w=b;       //存入优惠的价格
            }
        }
        int ans=L[1];
        int Min=INF;
        //最高等级的与最低的等级差不会超过M
        for(int i=0; i<=M; i++)
        {
            memset(has,0,sizeof(has));
            for(int j=1; j<=N; j++)
            {
                if(ans-L[j]<=M-i&&L[j]-ans<=i)
                {
                    has[j]=1;
                }
            }
            int k=Bellman(1);
            if(Min>k)
				Min=k;
        }
        printf("%d\n",Min);        

    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-28 03:18:18

poj1062 Bellman 最短路应用的相关文章

poj 3259 bellman最短路判断有无负权回路

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 36717   Accepted: 13438 Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way p

昂贵的聘礼---poj1062(最短路)

题目链接:http://poj.org/problem?id=1062 题意很清楚: 可以虚拟一个起点0,由于存在等级关系,所以可以枚举等级,然后把各种关系建立边,然后计算0到1的距离即可,去最小值即可: #include <iostream> #include <stdio.h> #include <math.h> #include <string.h> #include <queue> #include <stack> #incl

POJ1062 Expensive dowry 【最短路dijkstra】

详细看:http://blog.csdn.net/lyy289065406/article/details/6645852 简单说一下:每个物品是一个结点,边的权值是,edge[u][v]的值表示用物品u换物品v的价格 一开始所有物品都置为原价,即所有dist[i]为原价,用dijkstra算法,算出0点(啥物品都没有)到各点的最短距离,求出dist[1]即为花费 枚举每个物品的等级为这条交易链的最高等级,把所有等级高于它的或者比它小超过等级限制的点都剔除,可以用bool数组剔除,然后用上述的d

POJ-1847 最短路裸题,Floyd, Bellman, Dijkstra, Spfa

POJ 1847 题意:n个点,电车从A到B.每个点可以到其它ki个点,但默认只通往给出的第一个点,如果要到其它点,必须改变轨道方向一次.问A到B最少改变几次轨道方向. 总结:裸裸的最短路,所以,狠狠的把Floyd, Bellman, Dijkstra, Spfa都给撸了一遍.一个字,爽! // POJ-1847 //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<cstdl

蓝桥杯 算法训练 最短路 [ 最短路 bellman ]

传送门 算法训练 最短路 时间限制:1.0s   内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边. 输出格式 共n-1行,第i行表示1号点到i+1号点的最短路. 样例输入 3 3 1 2 -1 2 3 -1 3 1 2 样例输出 -1 -2 数据规

ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

//转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX 105 int lim, n; int p[M

POJ1062昂贵的聘礼[最短路建模]

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45892   Accepted: 13614 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000

poj1062 最短路(加限制)

http://poj.org/problem?id=1062 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可

POJ1062 昂贵的聘礼(最短路)

说白了就是给你一张图,每一个点有一个等级限制,在等级限制以内求一条最短路. 构图方法:首先将原点0连向每个物品相应的编号,那么边权为物品的初始价格:假设对于物品j,假设有了物品i,那么j的优惠价为w,就在i,j之间连一条权值为w的边.最后枚举等级的范围(注意等级的上下差为m,当中包括了酋长的等级,而不是与酋长等级差的绝对值小于等于m QAQ),求到原点到酋长(0号点到1号点)的最短路. #include<iostream> #include<cstdio> #include<