Time Limit: 1000MS
Memory Limit: 10000KB
64bit IO Format: %I64d & %I64u

SubmitStatus

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

思路:用Dijkstra求有向图的最短路。

每一个物品看成一个节点,酋长的允诺也看作一个物品(规定编号为1), 假设一个物品加上金币能够交换还有一个物品。则这两个节点之间有边,权值为金币数。求第一个节点到全部节点的最短路。由于有等级限制。所以枚举每一个点作为最低等级,选取符合全部符合等级限制的点。

设置源点为0,转化为求从0到1的最短路。

构图要注意。有等级限制,两个物品的等级之差不能超过 m。所以应该是建立有向图。 A->B,  用A物品交换得到B物品,要加上value价值,也就是A->B的权值为value。

<span style="font-size:18px;"><span style="font-size:18px;">#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std; const double PI = acos(-1.0);
const double e = 2.718281828459;
const double eps = 1e-8;
const int INF = 0x7fffffff;
const int MAXN = 110;
int g[MAXN][MAXN];
int dist[MAXN];
int level[MAXN];
int vis[MAXN];
int n, m; int Dijkstra()
{ //从0到1的最短路
int u, temp;
for(int i = 0; i <= n; i++)
dist[i] = g[0][i];
vis[0] = 1;
for(int i = 1; i <= n; i++)
{
u = 0;
temp = INF;
for(int j = 0; j <= n; j++)
{
if(!vis[j] && temp>dist[j])
{
temp = dist[j];
u = j;
}
}
if(u == 0)
break;
vis[u] = 1;
for(int j = 1; j <= n; j++)
{
if(!vis[j] && g[u][j]!=INF && dist[j]>dist[u]+g[u][j])
dist[j] = dist[u]+g[u][j];
}
}
return dist[1];
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while(cin>>m>>n)
{
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
g[i][j] = (i==j)? 0:INF;
}
}
memset(level, 0, sizeof(level));
int p, l, x;
int t, v;
for(int i = 1; i <= n; i++)
{
scanf("%d %d %d", &p, &l, &x);
g[0][i] = p; //不用中间交换物,原本须要的金钱
level[i] = l; //记录该物品的等级
while(x--)
{
scanf("%d %d", &t, &v);
g[t][i] = v; //用t交换得到i,要加上的金钱
}
}
int temp = INF;
int minprice = INF;
int maxlv;
for(int i = 1; i <= n; i++)
{
maxlv = level[i]; //把当前物品的等级临时看做最高等级
for(int j = 1; j <= n; j++)
{
//当其他物品j的等级比当前物品高(保证单向性),或者两者等级之差超出限制m时
if(level[j]>maxlv || maxlv-level[j]>m)
vis[j] = 1; //忽略这个点
else
vis[j] = 0;
}
temp = Dijkstra();
minprice = min(minprice, temp); //维护最小值
}
cout<<minprice<<endl;
}
return 0;
}
</span>

POJ - 1062 昂贵的聘礼(最短路Dijkstra)的更多相关文章

  1. poj 1062 昂贵的聘礼 最短路 dijkstra

    #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #incl ...

  2. POJ 1062 昂贵的聘礼 最短路 难度:0

    http://poj.org/problem?id=1062 #include <iostream> #include <cstring> #include <queue ...

  3. POJ 1062 昂贵的聘礼 最短路+超级源点

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...

  4. 最短路(Dijkstra) POJ 1062 昂贵的聘礼

    题目传送门 /* 最短路:Dijkstra算法,首先依照等级差距枚举“删除”某些点,即used,然后分别从该点出发生成最短路 更新每个点的最短路的最小值 注意:国王的等级不一定是最高的:) */ #i ...

  5. POJ 1062 昂贵的聘礼(图论,最短路径)

    POJ 1062 昂贵的聘礼(图论,最短路径) Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女 ...

  6. poj 1062 昂贵的聘礼 (dijkstra最短路)

    题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

  7. 最短路POJ 1062 昂贵的聘礼

    C - 昂贵的聘礼 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit St ...

  8. POJ 1062 昂贵的聘礼(带限制条件的dijkstra)

    题目网址:http://poj.org/problem?id=1062 题目: 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

  9. POJ 1062 昂贵的聘礼 (最短路)

    昂贵的聘礼 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/M Description 年轻的探险家来到了一个印第安部落里.在那里 ...

随机推荐

  1. Python9-day4 作业

    #!/usr/bin/env python# -*- coding:utf-8 -*-# Author:Timli = ["alex", "eric", &qu ...

  2. (转) 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文教程(精)

    原文地址:http://blog.csdn.net/holydancer/article/details/9219333 概述: 苹果的证书繁锁复杂,制作管理相当麻烦,今天决定重置一个游戏项目中的所有 ...

  3. JavaScript正则表达式-边界符

    ^:表示字符串开始位置,在多行匹配中表示一行的开始位置. /^\w+/匹配字符串中第一个单词. $:表示字符串结束的位置,在多行匹配中表示一行的结束位置. /\w+$/匹配字符串中最后一个单词. /@ ...

  4. PAT Basic 1029

    1029 旧键盘 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在2行中分别给出应该输 ...

  5. java读写串口数据

    本博文参考自https://www.cnblogs.com/Dreamer-1/p/5523046.html 最近接触到了串口及其读写,在此记录java进行串口读写的过程. 1.导入串口支持包 需要下 ...

  6. MFC中Picture控件显示图像

    图片显示在picture控件中,整个软件最小化后图片消失问题. 解决方案:OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面 - CSDN博客  http:// ...

  7. [uiautomator篇] 找父亲节点和其他兄弟节点

    https://testerhome.com/topics/1250 Appium [已解决] UiSelector 如何根据节点定位到父节点 / 兄弟节点? liqing380 · 发布于 2014 ...

  8. 九度oj 题目1104:整除问题

    题目描述: 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除. 输入: 两个整数n(2<=n<=1000),a(2<=a<=1000) 输出: 一个整数. ...

  9. mac上安装ruby

    (转:http://www.cnblogs.com/daguo/p/4097263.html) 以下代码区域,带有 $ 打头的表示需要在控制台(终端)下面执行(不包括 $ 符号) 步骤0 - 安装系统 ...

  10. [luoguP3110] [USACO14DEC]驮运Piggy Back(SPFA || BFS)

    传送门 以 1,2,n 为起点跑3次 bfs 或者 spfa 那么 ans = min(ans, dis[1][i] * B + dis[2][i] * E + dis[3][i] * P) (1 & ...