题目链接

分析:

一开始以为简单的DFS,直接做,MLE了。

本体应该用最短路径(Dijkstra算法)做。

此题的关键在于等级限制的处理,采用枚举,即假设酋长等级为5,等级限制为2,那么需要枚举等级从3~5,4~6,5~7
从满足改等级范围的结点组成的子图中用Dijkstra来算出最短路径,最后求出最小值。

AC代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue> using namespace std; const int maxn = +;
const int INF = (<<); int G[maxn][maxn], level[maxn], val[maxn], n, d[maxn];
bool lim[maxn]; int dijkstra() {
bool vis[maxn];
memset(vis, false, sizeof(vis)); for(int i=; i<=n; i++) d[i] = INF;
d[] = ; for(int i=; i<n; i++) {
int m = INF, x;
for(int y=; y<=n; y++) if(!vis[y] && lim[y] && m >= d[y]) m = d[x=y];
vis[x] = true;
for(int y=; y<=n; y++) if(!vis[y] && lim[y] && d[y]>d[x]+G[x][y]) d[y] = d[x]+G[x][y];
} int ans = INF;
for(int i=; i<=n; i++) {
d[i] += val[i];
ans = min(ans, d[i]);
}
return ans;
} int main() {
int p, l, x, t, v;
int m;
//freopen("my.txt", "r", stdin);
while(scanf("%d%d", &m,&n) == ) {
for(int i=; i<=n; i++) {
for(int j=; j<=n; j++) {
G[i][j] = INF;
}
} for(int i=; i<=n; i++) {
scanf("%d%d%d", &p, &l, &x);
val[i] = p; level[i] = l; for(int j=; j<x; j++) {
scanf("%d%d", &t, &v);
G[i][t] = v;
}
} int ans = INF; for(int i=; i<=m; i++) {
memset(lim, false, sizeof(lim));
for(int j=; j<=n; j++) {
if(level[j] >= level[]-m+i && level[j] <= level[]+i) lim[j] = true;
} ans = min(ans, dijkstra());
} printf("%d\n", ans);
} return ;
}

MLE代码也贴下。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue> using namespace std; const int maxn = +; struct Edge {
int nu, p, next;
}ed[]; struct node {
int p, l;
int next;
}head[maxn]; int mem, m; void add(int u, int v, int p) {
ed[mem].nu = v;
ed[mem].p = p;
ed[mem].next = head[u].next;
head[u].next = mem++;
}; int dfs(int u, int minv, int maxv) { int ans = head[u].p; for(int i=head[u].next; i != -; i = ed[i].next) {
int nmin = min(minv, head[ed[i].nu].l);
int nmax = max(maxv, head[ed[i].nu].l);
if(nmax - nmin > m) continue;
if(ed[i].p >= ans) continue;
ans = min(ans, ed[i].p + dfs(ed[i].nu, nmin, nmax));
} return ans;
} int main() {
int n;
int p, l, x, nu; //freopen("my.txt", "r", stdin);
while(scanf("%d%d", &m,&n) == ) {
mem = ; for(int i=; i<=n; i++) {
scanf("%d%d%d", &p, &l, &x); head[i].p = p; head[i].l = l; head[i].next = -; for(int j=; j<x; j++) {
scanf("%d%d", &nu, &p);
add(i, nu, p);
}
} printf("%d\n", dfs(, head[].l, head[].l));
} return ;
}

POJ1062 昂贵的聘礼(最短路)的更多相关文章

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

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45892   Accepted: 13614 Descripti ...

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

    题目链接:http://poj.org/problem?id=1062 Description 年轻的探险家来到了一个印 第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用1000 ...

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

    POJ-1062 昂贵的聘礼:http://poj.org/problem?id=1062 题意: 有一个人要到1号点花费最少的钱,他可以花费一号点对应的价格,也可以先买下其他一些点,使得费用降低. ...

  4. [poj1062]昂贵的聘礼_最短路_离散化

    昂贵的聘礼 poj-1062 题目大意:原文链接?不是英文题,自己看 注释:$1\le N \le 100$. 想法:开始的想法有些过于简单,因为落下了一个条件:就是等级限制是一条路径上的任意两点而不 ...

  5. POJ1062昂贵的聘礼(经典) 枚举区间 +【Dijkstra】

    <题目链接>                   昂贵的聘礼 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用1000 ...

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

    昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u SubmitStatus Descr ...

  7. POJ1062昂贵的聘礼(dijkstra)

    昂贵的聘礼 题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1 由于有N个物 ...

  8. POJ1062 昂贵的聘礼 【DFS】

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37475   Accepted: 10816 Descripti ...

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

    //转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring ...

随机推荐

  1. Android下 scrollview的滚动停止事件的监听方法

    使用递归调用的方法,每隔5毫秒检查一下是否已经停止,如果已经停止,就拿到事件啦! 不扯蛋,直接上代码. scrollContent就是我的scrollview. [代码]java代码: ? 1 2 3 ...

  2. 自我理解foreach工作原理

        很多时候我们在使用for循环遍历一个数组的时候,我们都知道可以通过下标的索引找到当前数组中所对应的数据.这只对于简单的数组或集合,如果我们存储的数据不止只有数据项,还有一个标识项,就如同Has ...

  3. Android 图标右上角添加数字提醒

    方法一:使用开源项目ViewBadger,github上的地址:https://github.com/jgilfelt/android-viewbadger 效果如图所示: <TextView ...

  4. Java的容器小结

    1. 各个类与接口的关系:

  5. service redis does not support chkconfig的解决办法

    原文链接: http://my.oschina.net/maczhao/blog/322931 问题解决办法如下: 必须把下面两行注释放在/etc/init.d/redis文件靠前的注释中: # ch ...

  6. Android内存泄漏的各种原因详解

    转自:http://mobile.51cto.com/abased-406286.htm 1.资源对象没关闭造成的内存泄漏 描述: 资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我 ...

  7. XCode的一些调试技巧

    XCode 内置GDB,我们可以在命令行中使用 GDB 命令来调试我们的程序.下面将介绍一些常用的命令以及调试技巧. po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 ...

  8. java_log_01

    logback&slf4j(本文中的版本为logback1.1.7.slf4j1.7.21),参照 原作者:Ceki Gülcü.Sébastien Pennec中文版译者:陈华联系方式:cl ...

  9. 对于HttpContext.Current的一点理解

    string[] userInfomationSplits = HttpContext.Current.User.Identity.Name.Split(new string[] { "\\ ...

  10. KB006: CSS 框模型( Box module )

    框和布局 在 KB005: CSS 层叠 中已经介绍了 CSS 的重要之处.CSS 可以说是页面表现的基础, CSS 可以控制布局,控制元素的渲染. 布局是讲在电影画面构图中,对环境的布置.人物地位的 ...