POJ1062 昂贵的聘礼(最短路)
题目链接。
分析:
一开始以为简单的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 昂贵的聘礼(最短路)的更多相关文章
- POJ1062昂贵的聘礼[最短路建模]
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45892 Accepted: 13614 Descripti ...
- POJ-1062 昂贵的聘礼( 最短路 )
题目链接:http://poj.org/problem?id=1062 Description 年轻的探险家来到了一个印 第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用1000 ...
- POJ-1062 昂贵的聘礼 (最短路)
POJ-1062 昂贵的聘礼:http://poj.org/problem?id=1062 题意: 有一个人要到1号点花费最少的钱,他可以花费一号点对应的价格,也可以先买下其他一些点,使得费用降低. ...
- [poj1062]昂贵的聘礼_最短路_离散化
昂贵的聘礼 poj-1062 题目大意:原文链接?不是英文题,自己看 注释:$1\le N \le 100$. 想法:开始的想法有些过于简单,因为落下了一个条件:就是等级限制是一条路径上的任意两点而不 ...
- POJ1062昂贵的聘礼(经典) 枚举区间 +【Dijkstra】
<题目链接> 昂贵的聘礼 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用1000 ...
- POJ - 1062 昂贵的聘礼(最短路Dijkstra)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u SubmitStatus Descr ...
- POJ1062昂贵的聘礼(dijkstra)
昂贵的聘礼 题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1 由于有N个物 ...
- POJ1062 昂贵的聘礼 【DFS】
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37475 Accepted: 10816 Descripti ...
- ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)
//转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring ...
随机推荐
- HTML5新特性之Canvas+drag(拖拽图像实现图像反转)
1.什么是canvas 在网页上使用canvas元素时,会创建一块矩形区域,默认矩形区域宽度300px,高度150px.. 页面中加入canvas元素后,可以通过javascript自由控制.可以在其 ...
- PHP安全编程:shell命令注入(转)
使用系统命令是一项危险的操作,尤其在你试图使用远程数据来构造要执行的命令时更是如此.如果使用了被污染数据,命令注入漏洞就产生了. exec()是用于执行shell命令的函数.它返回执行并返回命令输出的 ...
- Android源代码分析之Framework的MediaPlayer
在Android中MediaPlayer用来播放音频和视频文件,在这里分析下在Framework层中MediaPlayer是怎样调用的.MediaPlayer的代码位于:./frameworks/ba ...
- 使用搬瓦工搭建javaweb环境
/* 本文是基于搬瓦工vps的centos-6-x86_64的Linux系统搭建. 需准备的工具:1.putty(用于连接Linux系统) 2.WinSCP(搬瓦工官方提供的ftp上传下载工 ...
- codevs1044四子连棋(Dfs)
/* 数据范围太小 暴力暴力 Dfs直接 终止条件嘛 就是4中目标棋局 挨着枚举一遍就好了 搜索的起点一定是空格 当然 空格周围有黑有白 黑先走或者白先走答案可能不一样 所以 维护一个b 表示这一步走 ...
- Windows Azure上的Odoo(OpenERP)-2.在Ubuntu虚拟机上部署Odoo(OpenERP)
创建虚拟机的步骤在这里就不再赘述了,请参考上一篇博文. 首先用下述命令将Ubuntu系统进行更新: 1. sudo apt-get update 2. sudo apt-get upgrade 3. ...
- MySQL+PHP配置 Windows系统IIS版(转)
1.下载 MySQL下载地址:http://dev.mysql.com/downloads/mysql/5.1.html->Windows (x86, 32-bit), MSI Installe ...
- C#简单邮件发送
System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(); message.From = new System.N ...
- 静态html传参数
记下来备忘 a.html <html> <head> <body> <a href="c.html?test=大师大师" target=& ...
- SVN global ignore pattern for c#
*.resharperoptions Web_Data log */[Bb]in [Bb]in */obj obj */TestResults TestResults *.svclog Debug ...