51nod1459 带权最短路
第一行4个整数n (<=500), m, start, end。n表示房间的个数,房间编号从0到(n - 1),m表示道路数,任意两个房间之间最多只有一条道路,start和end表示起点和终点房间的编号。
第二行包含n个空格分隔的正整数(不超过600),表示进入每个房间你的得分。
再接下来m行,每行3个空格分隔的整数x, y, z (0<z<=200)表示道路,表示从房间x到房间y(双向)的道路,注意,最多只有一条道路连结两个房间, 你需要的时间为z。
输入保证从start到end至少有一条路径。
一行,两个空格分隔的整数,第一个表示你最少需要的时间,第二个表示你在最少时间前提下可以获得的最大得分。
3 2 0 2
1 2 3
0 1 10
1 2 11
21 6
那这个题目,暴力的想法是求出所有最短路,选一条价值最大的
那其实不必这么麻烦,我们可以先求出一条最短路,同时更新其价值,如果存在比其价值更高并且还在这条最短路上的边
我们就继续让大的价值松弛小的价值,当然前提是在最短路上跑,于是有两种入队情况,第一距离被松弛,第二最短路的价值被松弛
那么之前我对dij的堆实现是有一些疑问的,怎么做到push进去的点按照权值优先级pop呢,因为你push进去那个值是死的
而dist数组是动态变化的,难道我们要动态修改堆吗,这就很复杂了
那其实不必这样,初始我们只push需要松弛其他点的点就好,那么如果该点没松弛其他点之前被松弛怎么办,更新堆吗
那其实不必这样做,我们push一个dist更小的同样编号的点就好,第一他会先出来,如果终点被完全松弛,那么退出
如果权值大的也出来,那么它对于松弛过的边无能为力,所以综合一下,我们只是多花费了一些空间,但是由于dij的特性
队列中的点很有限,所以我们也不必担心空间上不足
附上代码
1 #include <stdio.h>
2 #include <queue>
3 #include <algorithm>
4 #include <vector>
5 using namespace std;
6 const int maxn=5e2+7;
7 struct node{
8 int v,a;node(){};node(int v,int a):v(v),a(a){};
9 bool operator < (const node &rhs) const{
10 return a>rhs.a;
11 }
12 };
13 vector<int> G[maxn];
14 const int INF=(~1u)>>2;
15 int dist[maxn],mon[maxn],p[maxn],s,e,n,m,w[maxn][maxn];
16 void dij(){
17 for(int i=0;i<n;++i) dist[i]=INF,mon[i]=0;
18 dist[s]=0;mon[s]=p[s];
19 priority_queue<node> Q;Q.push(node(s,0));
20 while(Q.size()){
21 node now=Q.top();Q.pop();
22 if(now.v==e) break;
23 for(int i=0;i<G[now.v].size();++i){
24 int v=G[now.v][i];
25 if(dist[v]>dist[now.v]+w[now.v][v]){
26 dist[v]=dist[now.v]+w[now.v][v];
27 mon[v]=p[v]+mon[now.v];
28 Q.push(node(v,dist[v]));
29 }
30 else if(dist[v]==dist[now.v]+w[now.v][v]){
31 if(mon[v]<p[v]+mon[now.v]){
32 mon[v]=p[v]+mon[now.v];
33 Q.push(node(v,dist[v]));
34 }
35 }
36 }
37 }
38 }
39 int main(){
40 //freopen("1459.txt","r",stdin);
41 scanf("%d%d%d%d",&n,&m,&s,&e);
42 for(int i=0;i<n;++i) scanf("%d",p+i);
43 int u,v,b;
44 for(int i=0;i<m;++i){
45 scanf("%d%d%d",&u,&v,&b);
46 G[u].push_back(v);
47 G[v].push_back(u);
48 w[u][v]=w[v][u]=b;
49 }dij();
50 printf("%d %d\n",dist[e],mon[e]);
51 return 0;
52 }
51nod1459 带权最短路的更多相关文章
- 51nod1459(带权值的dijkstra)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 题意:中文题诶- 思路:带权值的最短路,这道题数据也没 ...
- PTA L2-001 紧急救援 (带权最短路)
<题目链接> 题目大意: 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...
- BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)
BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...
- BZOJ_4609_[Wf2016]Branch Assignment_决策单调性+带权二分
BZOJ_4609_[Wf2016]Branch Assignment_决策单调性+带权二分 Description 要完成一个由s个子项目组成的项目,给b(b>=s)个部门分配,从而把b个部门 ...
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
- Java数据结构——带权图
带权图的最小生成树--Prim算法和Kruskal算法 带权图的最短路径算法--Dijkstra算法 package graph; // path.java // demonstrates short ...
- 带权图的最短路径算法(Dijkstra)实现
一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...
- [NOIP摸你赛]Hzwer的陨石(带权并查集)
题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...
- poj1417 带权并查集 + 背包 + 记录路径
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2713 Accepted: 868 Descrip ...
随机推荐
- RocketMQ—消息队列入门
消息队列功能介绍 字面上说的消息队列是数据结构中"先进先出"的一种数据结构,但是如果要求消除单点故障,保证消息传输可靠性,应对大流量的冲击,对消息队列的要求就很高了.现在互联网的& ...
- [Usaco2002 Feb]Rebuilding Roads重建道路
题目描述 一场可怕的地震后,奶牛用N个牲口棚(1 <= N <= 150,编号1..N)重建了农民John的牧场.奶牛没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是唯一 ...
- perl打开本地/服务器图片
index.html <html> <body> <h2> perl read img </h2> <img src = "displa ...
- 使用Canal作为mysql的数据同步工具
一.Canal介绍 1.应用场景 在前面的统计分析功能中,我们采取了服务调用获取统计数据,这样耦合度高,效率相对较低,目前我采取另一种实现方式,通过实时同步数据库表的方式实现,例如我们要统计每天注册与 ...
- 从零搭建一个IdentityServer——项目搭建
本篇文章是基于ASP.NET CORE 5.0以及IdentityServer4的IdentityServer搭建,为什么要从零搭建呢?IdentityServer4本身就有很多模板可以直接生成一个可 ...
- JMETER-正则表达式提取与查看变量是否提取正确
一.应用场景说明: 在一个线程组中,B请求需要使用A请求返回的数据,也就是常说的关联,将上一个请求的响应结果作为下一个请求的参数,则需要对A请求的响应报文使用后置处理器,其中最方便最常用的就是正则表达 ...
- 查看窗口名 调用dll setForegroundWindow
package main import ( "fmt" "log" "syscall" "unsafe" ) var ( ...
- 网页小实验——用canvas生成精灵动画图片
实验目标:借助canvas把一张国际象棋棋子图片转换为一组适用于WebGL渲染的精灵动画图片,不借助其他图片处理工具,不引用其他库只使用原生js实现. 初始图片如下: 一.图片分割 将初始图片分割为六 ...
- loj10173
炮兵阵地 司令部的将军们打算在 N×M 的网格地图上部署他们的炮兵部队.一个 N×M的地图由 N 行 M 列组成,地图的每一格可能是山地(用 H 表示),也可能是平原(用 P表示),如下图.在每一格平 ...
- XCTF-easydex
前期工作 查壳,无.安装打开黑屏. 逆向分析 用jadx打开看看 什么都没有,但可以看一下AndroidManifest 可以看到这个是个纯C/C++写的,没有Java代码,是个NativeActiv ...