题目连接: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. CSS兼容性总结

    一.针对IE6的 !important 必须写在前面,例如: background:#9C6 !important;background:#999; 二.CSS HACK //IE6 专用 _heig ...

  2. 【转】如何解决每次打开office2010都会出现正在配置以及使用KMS

    转自:http://jingyan.baidu.com/article/90895e0fb1525964ec6b0bb5.html 一.使用mini-KMS_Activator_v1.2_Office ...

  3. CFS/FQ/PQ调度与WRR负载均衡

    动机 五一临近,四月也接近尾声,五一节乃小长假的最后一天.今天是最后一天工作日,竟然感冒了,半夜里翻来覆去无法安睡,加上窗外大飞机屋里小飞机(也就是蚊子)的骚扰,实在是必须起来做点有意义的事了!    ...

  4. POJ 开关问题 解题报告

    开关问题 Time Limit: 1000MS Memory Limit: 30000K Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他 ...

  5. 【BZOJ 1647】[Usaco2007 Open]Fliptile 翻格子游戏 模拟、搜索

    第一步我们发现对于每一个格子,我们只有翻和不翻两种状态,我们发现一旦确定了第一行操作,那么第二行的操作也就随之确定了,因为第一行操作之后我们要想得到答案就得把第一行全部为0,那么第二行的每一个格子的操 ...

  6. xiaoluo同志Linux学习之CentOS6.4

    小罗同志写的不错,弄个列表过来啊   Linux学习之CentOS(三十六)--FTP服务原理及vsfptd的安装.配置 xiaoluo501395377 2013-06-09 01:04 阅读:56 ...

  7. javaScript获取文档中所有元素节点的个数

    HTML+JS 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  8. Java中中英文对齐输出问题,以及Java中的格式化输出

    一 中英文对齐输出问题 问题,要求控制台输出如下: abcefg  def 森林 阿狗 其实就是要求对齐输出,各种查找java的格式化输出,然后发现只要一个简单的“\t”就可以实现. 代码如下: Sy ...

  9. centos网络配置之桥接模式

    一:前沿 来这家公司好久了,都没有开始写博客,都是积累着,都没有去写,今天实在是天激动了,我的虚拟机在配置好了之后折腾了一天都没有折腾出来可以上网,今天来了继续折腾,然后我该ip,改连接方式,我擦,终 ...

  10. Topcoder SRM 607 div1题解

    好久没来写了,继续继续... Easy(250pts): //前方请注意,样例中带有zyz,高能预警... 题目大意:给你一个字符串,中间有一些是未知字符,请你求出这个字符串的回文子串个数的期望值.数 ...