题目链接

分析:

一开始以为简单的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. 基于redis 内存数据库简单使用

    在ecplise中使用内存数据的客端户,前提要准备要下载两个jar包 commons-pool2-2.0.jar jedis-2.4.2.jar 前提准备做好了,那我们就开启redis的服务,打开一个 ...

  2. 一个站点的诞生06-- ORM

    站点上的数据,存在数据库里. 一般用Mysql,也实用sqlite,Postgre.操作数据库要会SQL语言,这个有点麻烦,经常须要查手冊. 此外.每家数据库在实现SQL语言的时候,经常会加料,添加一 ...

  3. Java基础知识强化之IO流笔记20:FileOutputStream写出数据实现换行和追加写入

    1.  如何实现数据的换行? (1) package com.himi.fileoutputstream; import java.io.FileNotFoundException; import j ...

  4. Bridge 桥梁模式 桥接模式

    简介 将[抽象部分](Abstraction,人)与[实现部分](Implementor,人穿的衣服)分离,使它们都可以独立的变化. [业务抽象角色]引用[业务实现角色],或者说[业务抽象角色]的部分 ...

  5. (转)H264(NAL简介与I帧判断)

    1.NAL全称Network Abstract Layer, 即网络抽象层.         在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(N ...

  6. codevs 2495 水叮当的舞步IDA*

    /* 比较简单的A* 估价函数很简单就是除了左上角的联通快之外的不同的个数 加上迭代 好像答案最多在16步之内出解 这样裸裸的交上去是50分 在考虑剪枝 每个选颜色的时候一定是选左上角联通快附近的颜色 ...

  7. oracle解析xml完成版第二次修改

    其实XML字符串就好像是ORACLE中的外部表,因此Oracle对 解析XML字符串一些规则要求非常严格.XML字符串提供的数据就是一张表,所以Oracle必须提供跟 xml数据一致的列头 示例一 S ...

  8. iOS开发UI篇——九宫格坐标计算

    一.要求 完成下面的布局 二.分析 寻找左边的规律,每一个uiview的x坐标和y坐标. 三.实现思路 (1)明确每一块用得是什么view (2)明确每个view之间的父子关系,每个视图都只有一个父视 ...

  9. Win7-IIS7下运行PHP网站(以配置好的drupal网站为例)

    0.前提:IIS7已启用. drupal网站配置文件web.config中用到了“简洁链接”(URL重写),所以,还需要事先安装URL重写模块. URL重写模块(url rewrite)下载地址: r ...

  10. C语言内存对齐原理

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...