题目链接:https://cn.vjudge.net/problem/POJ-1062

题意

虽然是中文题,还是简单复述一下吧

我们想要酋长的女儿作为老婆。作为交换,酋长想要点钱。

酋长提出可以用其他人的东西来降低价格,然而其他人也想通过别人的东西来降低他们的价格。

由于每个人等级不一样,所以在每一条“交易链”中,不能出现地位差值大于M的情况。

求老婆的最小价值

思路

直接转化为最短路问题,难点在于如何处理地位差和物品价格(老婆价值=边权和+物品价格)的问题

  1. 受到Dijkstra的启发,我们可以设两个数组minLevel, maxLevel作为某交易链中的最小地位和最大地位

    这样在松驰操作前,可以直接判断该节点可否更新(地位是否可行)

  2. 物品价格更好处理,处理完边权后,在dist上直接加价格即可

代码

#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=110, maxm=maxn*maxn, INF=0x3f3f3f3f;
typedef pair<long long, int> Node;
struct Edge{
int to, next;
long long cost;
Edge(int to=0, int next=9, long long cost=0):
to(to), next(next), cost(cost) {}
}edges[maxm+5];
struct Cmp{
bool operator () (const Node &a, const Node &b){
return a.first>b.first;
}
};
struct Point{
long long price;
int level;
Point(long long price=0, int level=0):
price(price), level(level) {}
}points[maxn+5];
int head[maxn], esize, minlv[maxn+5], maxlv[maxn+5], n, m;
long long dist[maxn+5];
void addEdge(int from, int to, long long cost){
edges[esize]=Edge(to, head[from], cost);
head[from]=esize++;
} void init(void){
memset(head, -1, sizeof(head));
esize=0;
} inline bool outer(const int &to, const int &from){
if (abs(minlv[from]-points[to].level)<=m && abs(maxlv[from]-points[to].level)<=m)
return false;
return true;
} long long Dij(void){
priority_queue<Node, vector<Node>, Cmp> que;
memset(dist, INF, sizeof(dist)); dist[1]=0; memset(maxlv, 0, sizeof(maxlv));
memset(minlv, INF, sizeof(minlv));
maxlv[1]=minlv[1]=points[1].level; que.push(Node(dist[1], 1));
while (que.size()){
Node x=que.top(); que.pop();
if (x.first!=dist[x.second]) continue; int &from=x.second;
for (int i=head[from]; i!=-1; i=edges[i].next){
Edge &e=edges[i];
int &to=e.to, &level=points[to].level;
long long &dis=e.cost; if (outer(to, from) || dist[to]<=dist[from]+dis) continue;
dist[to]=dist[from]+dis;
maxlv[to]=max(maxlv[from], level);
minlv[to]=min(minlv[from], level); que.push(Node(dist[to], to));
}
} long long ans=INF;
for (int i=1; i<=n; i++)
ans=min(dist[i]+points[i].price, ans);
return ans;
} int main(void){
int price, level, x, to;
long long cost; while (scanf("%d%d", &m, &n)==2 && n){
init();
for (int from=1; from<=n; from++){
scanf("%lld%d%d", &points[from].price, &points[from].level, &x);
for (int i=0; i<x; i++){
scanf("%d%lld", &to, &cost);
addEdge(from, to, cost);
}
}
printf("%lld\n", Dij());
} return 0;
}
Time Memory Length Lang Submitted
None 360kB 2482 C++ 2018-05-31 18:30:11

最新文章

  1. JS 获取浏览器窗口大小
  2. ubuntu下Tomcat7的安装和配置
  3. The Shortest Path in Nya Graph---hdu4725(spfa+扩点建图)
  4. MVC框架 - 捆绑
  5. JavaScript高级---组合模式设计
  6. LNMP一键安装包-CentOS 5/6下自动编译安装Nginx,MySQL,PHP
  7. top -Hp pid 显示所有的线程
  8. CSS找到 (div+css请讲)
  9. Remoting接口测试工具
  10. java的string.split()分割特殊字符时注意点
  11. HDU 3499 Flight spfa+dp
  12. view里面的tableview顶部被view的导航栏盖住了的问题
  13. Tesseract OCR win 32位编译
  14. packer的基本使用
  15. 控件的基本使用-iOS—UI笔记
  16. js异步
  17. 关于js中this指向的理解总结!
  18. 支持向量机通俗导论(理解SVM的三层境界)(ZT)
  19. 20155207王雪纯《网络对抗》Exp4 恶意代码分析
  20. 分布式Redis缓存串讲(一)

热门文章

  1. day13 基本的文件操作(好东西)
  2. ajax第一天总结
  3. Pyhton学习——Day36
  4. Model、ModelMap和ModelAndView的使用详解
  5. 说说Shell在代码重构中的应用
  6. 九、frp对外提供简单的文件访问服务
  7. python中return和print的区别(详细)
  8. oc基础知识
  9. 浅谈 Qt 布局那些事
  10. 洛谷——P3258 [JLOI2014]松鼠的新家