题目链接

分析:

一开始以为简单的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. Haskell 差点儿无痛苦上手指南

    趁着自己重装Linux 虚拟机的机会,把安装 haskell 的过程记录一下,顺便帮那些还犹豫徘徊在haskell门外的读者入门. 基本概念: Haskell : 是一门通用函数式语言,差点儿能够进行 ...

  2. RT:How HTTP use TCP connection

    In HTTP/0.9 (not used anymore), each request uses a separate TCP connection, and the end of a respon ...

  3. Xml解析之——Java/Android/Python

    Xml解析之——Java/Android/Python 一.Xml文件 test.xml <note> <to>George</to> <from>Jo ...

  4. merge into Oracle里的 saveOrUapdate

    1.初始数据: SQL> select * from a; ID NAME ---------------------- ---------------------- 1 1 2 1 3 1 4 ...

  5. iOS 不同类之间的传值

    iOS是面向对象开发的,有很多不同的类,很多时候会遇到类与类之间的"交流"需求,比如通知.传递数值等等,(通知可以用nsnotificationcenter来做, 以后总结)下面主 ...

  6. UITabBarController自定义一

    UITabBarController自定义一 首先在Appdelegate.m文件中将UITabBarController的子类设置为rootViewController,并设置其viewContro ...

  7. CocoaPods使用详细说明(转)

    一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...

  8. WPF Binding

    winform有binding, WPF也有binding,区别在哪呢?这里暂时不提.以前也检查接触WPF binding, 但为什么过段时间就忘记了呢? 可能主要原因自己的知识体系不够完善吧,下面我 ...

  9. 【USACO 2.3.5】控制公司

    [题目描述] 有些公司是其他公司的部分拥有者,因为他们获得了其他公司发行的股票的一部分.例如,福特公司拥有马自达公司12%的股票.据说,如果至少满足了以下三个条件之一,公司A就可以控制公司B了: 公司 ...

  10. eclipse慢 优化(转)

    1.打开 eclipse.ini -showsplash com.genuitec.myeclipse.product --launcher.XXMaxPermSize 256M -vmargs -D ...