题目连接:http://poj.org/problem?id=1062

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

输出最少需要的金币数。
 
题目大意:
稍微有点绕,就是说目标节点原来的价格是10000,但是如果先到2号节点,再到目标节点,价格就变为8000。如果先到3号节点,再到目标节点,则价格变为5000,等等。要求找出最低可能的价格。但是有一个限制,每个节点都有等级值,如果已经到达一个较低等级的节点,则无法到达较高等级的节点。或是两节点之间的等级值差距超过给定的M,则这两个节点不能相互抵达。
解题思路:
很容易看出可以抽象成图,如果有优惠则在两点之间建边(有向),然后再建立一个汇总节点,连接其他所有节点,边权为其他节点本来的价格。问题就转化成了从汇总节点求单源最短路径。
建好图之后并不能直接跑dijkstra,因为还有限制条件。本来处理限制条件的方式是记录路径,但是后来发现不可行,于是转换思路。
两节点之间等级差不能超过M这个限制条件很好处理,松弛的时候加上限制即可,但是另一个限制条件不好处理。所以,枚举每一个节点,假设当前节点是等级最低的节点,把所有其他不符合限制条件的节点全部标记,这样就避免了出现不合法的情况,每次枚举跑一遍dijkstra,最后取最小值,时间复杂度O(n^3), 可以完成。代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define MAX 105
#define INF 0x3fffffff

using namespace std;

struct Node
{
    int level,price;
} node[MAX];

int G[MAX][MAX];
};
int d[MAX];
int n,m;

void dijkstra(int s)
{
    ; i<=n; i++)
    {
        d[i]=INF;
    }
    d[s]=;
    ; i<=n; i++)
    {
        int x,m=INF;
        ; j<=n; j++)
        {
            if(d[j]<m&&!vis[j])
            {
                m=d[j];
                x=j;
            }
        }
        vis[x]=;
        ; j<=n; j++)
        {
            if(vis[j])continue;//细节,dijkstra算法标记该节点只会跳过该节点作为起点,并不会阻止到该节点的边松弛,但是我们定义的标记是该节点不可访问,所以必须加上此判断,否则会WA
            d[j]=min(d[j],d[x]+G[x][j]);
        }
    }
}

int main()
{
    ;
    int res=INF;
    cin>>m>>n;
    ; i<=n; i++)
        ; j<=n; j++)
            G[i][j]=INF;
    ; i<=n; i++)
    {
        scanf("%d%d%d",&p,&l,&x);
        node[i].level=l;
        node[i].price=p;
        int v,d;
        while(x--)
        {
            scanf("%d%d",&v,&d);
            G[v][i]=d;
        }
    }
    ; i<=n; i++)
        G[][i]=node[i].price;
    ; i<=n; i++)
    {
        int level=node[i].level;
        ; j<=n; j++)
        {
            if(node[j].level-level>m||node[j].level<level)
                vis[j]=;
            else
                vis[j]=;
        }
        vis[]=;
        dijkstra();
        res=min(res,d[]);
    }
    cout<<res<<endl;
}

poj1062 最短路径 dijkstra的更多相关文章

  1. 最短路径 dijkstra

    最短路径 dijkstra #include <stdio.h> #include <string.h> #include <limits.h> #define M ...

  2. 网络最短路径Dijkstra算法

    最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...

  3. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  4. 单源最短路径Dijkstra算法,多源最短路径Floyd算法

    1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...

  5. 最短路径——Dijkstra算法和Floyd算法

    Dijkstra算法概述 Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图(无 ...

  6. 最短路径-Dijkstra算法与Floyd算法

    一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2   ADCE:3   ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...

  7. 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms           Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  8. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  9. 有向网络(带权的有向图)的最短路径Dijkstra算法

    什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...

随机推荐

  1. spring笔记(二)

    共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下: 用户库jar包,需要手动发布到 ...

  2. [HDU6304][数学] Chiaki Sequence Revisited-杭电多校2018第一场G

    [HDU6304][数学] Chiaki Sequence Revisited -杭电多校2018第一场G 题目描述 现在抛给你一个数列\(A\) \[ a_n=\begin{cases}1 & ...

  3. 【NOIP2017 D1 T1 小凯的疑惑】

    题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想知道在无法准确支付的物品中,最贵的 ...

  4. wyh的物品~(二分)

    链接:https://www.nowcoder.com/acm/contest/93/I来源:牛客网 题目描述 wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个, ...

  5. java实现极简的LRU算法

    import java.util.LinkedHashMap;import java.util.Map; /** * LRU (Least Recently Used)  */public class ...

  6. JavaScript获取HTML元素样式的方法(style、currentStyle、getComputedStyle)

    一.style.currentStyle.getComputedStyle的区别 style只能获取元素的内联样式,内部样式和外部样式使用style是获取不到的. currentStyle可以弥补st ...

  7. nginx proxy_buffer_size 解决后端服务传输数据过多,其实是header过大的问题

    nginx proxy_buffer_size 解决后端服务传输数据过多,其实是header过大的问题 这三个参数已设置就搞定了额 proxy_buffer_size 64k; proxy_buffe ...

  8. 【uva11855-求长度为1到n的相同子串出现的次数】sam

    题意:求长度为1到n的相同子串出现的次数,输到小于2为止. 题解: 用sam做. 建机,算right集合,然后用r[i]更新长度为step[i]的子串出现次数,然后ans[i]=maxx(ans[i] ...

  9. [bzoj2763][JLOI2011]飞行路线——分层图最短路

    水题.不多说什么. #include <bits/stdc++.h> using namespace std; const int maxn = 10010; const int maxk ...

  10. 手机端的META

    一.天猫 <title>天猫触屏版</title> <meta content="text/html; charset=utf-8" http-equ ...