POJ1722二维spfa+优先队列优化
题意:
给你一个有向图,然后求从起点到终点的最短,但是还有一个限制,就是总花费不能超过k,也就是说每条边上有两个权值,一个是长度,一个是花费,求满足花费的最短长度。
思路:
一开始写了一个mark[i][j]第i个点花费j状态的spfa,TLE了,然后又优化了下,就是先反向搜索一遍简单最短路(以花费为权值)然后用这个结果在mark[][]二维的最短路里面剪枝用,结果还是超时了,然后又尝试了下优先队列,结果900+ac险过,我把自己的第一个优化去掉,结果跑了800+,哎!对于在spfa上使用优先队列,这个我感觉还是不是很靠谱啊,如果不考虑优先队列的时间复杂度跑spfa确实是个优化,因为毕竟有点贪心的意思(具体能优化多少,要看数据,总之不会像记忆化搜索那样级别的优化就是了),可是优先队列的操作时间是log级别的,在他们两个之间去衡量,还是要看具体数据啊。
这是个有反向搜索预处理优化的ac代码,把反向预处理去掉之后会更快一点(哎!)
#include<queue>
#include<stdio.h>
#include<string.h>
#define N_node 100 + 5
#define N_edge 10000 + 10
#define INF 100000000
using namespace std;
typedef struct
{
int to ,next ,cost ,time;
}STAR;
typedef struct
{
int to ,next ,cost;
}STAR2;
typedef struct NODE
{
int id ,cost ,time;
friend bool operator < (NODE a ,NODE b)
{
return a.cost > b.cost || a.cost == b.cost && a.time > b.time;
}
}NODE;
int list[N_node] ,tot;
int list2[N_node] ,tot2;
int mark[N_node][10000+5];
int s_x[N_node][10000+5];
int s_x2[N_node];
STAR E[N_edge];
STAR2 E2[N_edge];
NODE xin ,tou;
void add(int a ,int b ,int c ,int d)
{
E[++tot].to = b;
E[tot].cost = c;
E[tot].time = d;
E[tot].next = list[a];
list[a] = tot;
}
void add2(int a ,int b ,int c)
{
E2[++tot2].to = b;
E2[tot2].cost = c;
E2[tot2].next = list2[a];
list2[a] = tot2;
}
void Spfa(int s ,int n ,int maxtime)
{
for(int i = 0 ;i <= n ;i ++)
for(int j = 0 ;j <= maxtime ;j ++)
s_x[i][j] = INF ,mark[i][j] = 0;
priority_queue<NODE>q;
xin.id = 1 ,xin.cost = xin.time = 0;
q.push(xin);
s_x[xin.id][xin.time] = 0;
mark[xin.id][xin.time] = 1;
while(!q.empty())
{
tou = q.top();
q.pop();
mark[tou.id][tou.time] = 0;
for(int k = list[tou.id] ;k ;k = E[k].next)
{
xin.id = E[k].to;
xin.cost = tou.cost + E[k].cost;
xin.time = tou.time + E[k].time;
if(xin.time + s_x2[xin.id]> maxtime) continue;
if(s_x[xin.id][xin.time] > s_x[tou.id][tou.time] + E[k].cost)
{
s_x[xin.id][xin.time] = s_x[tou.id][tou.time] + E[k].cost;
if(!mark[xin.id][xin.time])
{
mark[xin.id][xin.time] = 1;
q.push(xin);
}
}
}
}
}
void Spfa2(int s ,int n)
{
int mk[N_node] = {0};
for(int i = 0 ;i <= n ;i ++)
s_x2[i] = INF;
queue<int>q;
q.push(s);
mk[s] = 1;
s_x2[s] = 0;
while(!q.empty())
{
int xin ,tou;
tou = q.front();
q.pop();
mk[tou] = 0;
for(int k = list2[tou] ;k ;k = E2[k].next)
{
xin = E2[k].to;
if(s_x2[xin] > s_x2[tou] + E2[k].cost)
{
s_x2[xin] = s_x2[tou] + E2[k].cost;
if(!mk[xin])
{
mk[xin] = 1;
q.push(xin);
}
}
}
}
}
int main ()
{
int n ,m ,maxtime ,i;
int a ,b ,c ,d;
while(~scanf("%d" ,&maxtime))
{
scanf("%d %d" ,&n ,&m);
memset(list ,0 ,sizeof(list));
memset(list2 ,0 ,sizeof(list2));
tot = 1 ,tot2 = 1;
for(i = 1 ;i <= m ;i ++)
{
scanf("%d %d %d %d" ,&a ,&b ,&c ,&d);
add(a ,b ,c ,d);
add2(b ,a ,d);
}
Spfa2(n ,n);
Spfa(1 ,n ,maxtime);
int ans = INF;
for(i = 1 ;i <= maxtime ;i ++)
if(ans > s_x[n][i]) ans = s_x[n][i];
if(ans == INF) ans = -1;
printf("%d\n" ,ans);
}
return 0;
}
POJ1722二维spfa+优先队列优化的更多相关文章
- Firemonkey 原生二维码扫描优化
之前用了ZXing的Delphi版本,运行自带的例子,速度非常慢,与安卓版本的相比查了很多,因此打算使用集成jar的方法,但是总觉得美中不足. 经过一番研究,基本上解决了问题. 主要有两方面的优化: ...
- (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...
- 01二维背包+bitset优化——hdu5890
口胡一种别的解法: 三重退背包,g1[j]k]表示不选x的选了j件物品,体积为k的方案数,g[0][0] = 1 , g1[j][k]=dp[j][k]-g1[j-1][k-a[x]] 然后按这样再退 ...
- 洛谷 P5471 - [NOI2019] 弹跳(二维线段树优化建图+堆优化存边)
题面传送门 一道非常有意思的题(大概可以这么形容?) 首先看到这类一个点想一个区域内连边的题目可以很自然地想到线段树优化建图,只不过这道题是二维的,因此需要使用二维线段树优化建图,具体来说,我们外层开 ...
- POJ 1724 ROADS(二维SPFA)
题目链接 用STL实现超时了,用普通队列500+,看到spfa,反应太迟钝了. #include <cstring> #include <cstdio> #include &l ...
- SDUT 最短路径(二维SPFA)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2622 #include<stdio.h& ...
- POJ 2686 Traveling by Stagecoach(状压二维SPFA)
Traveling by Stagecoach Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3407 Accepted ...
- BZOJ3577:玩手机(最大流,二维ST表)
Description 现在有一堆手机放在坐标网格里面(坐标从1开始),坐标(i,j)的格子有s_(i,j)个手机. 玩手机当然需要有信号,不过这里的手机与基站与我们不太一样.基站分为两种:发送站和接 ...
- Android利用zxing生成二维码
感谢大佬:https://blog.csdn.net/mountain_hua/article/details/80646089 **gayhub上的zxing可用于生成二维码,识别二维码 gayhu ...
随机推荐
- CentOS 7关闭firewalld启用iptables 开放端口
在CentOS7中,有很多CentOS 6中的常用服务发生了变化. 其中iptables是其中比较大的一个.防火墙iptables被firewalld取代. 本文将介绍,如果采用systemctl关闭 ...
- FHRP - 网关冗余协议
通常情况下,在终端设备进入网络前,都会有一个 Router 充当网络,作为第一跳的网络地址.但假设路由器发生故障,此时终端设备就无法再接入互联网. 为了防止这样的问题,一般会再加入一台路由器充当备份. ...
- Java中HashMap的源码分析
先来回顾一下Map类中常用实现类的区别: HashMap:底层实现是哈希表+链表,在JDK8中,当链表长度大于8时转换为红黑树,线程不安全,效率高,允许key或value为null HashTable ...
- iNeuOS工业互联平台,生产过程业务联动控制
1.概述 工业物联网也好.工业互联网也好或是其他生产系统,反向控制始终无法回避.搞工业最直接.最体现效果的两个方面是采集各种数据和生产过程业务控制,所谓大数据预测和分析,那是仁者见仁.智者见智,下一篇 ...
- JDK 16 正式发布,一次性发布 17 个新特性…不服不行!
上一篇:Java 15 正式发布, 14 个新特性 JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. ...
- linux安装nginx 并配置文件服务器和代理服务器
linux安装nginx搭建服务并实现文件服务器和代理服务器配置 1.课题的背景和意义 由于编码过程中需要进行文件上传服务,文件上传后 需要有http资源的路径需要访问.原则上可以通过Apache . ...
- DAOS 分布式异步对象存储|故障模型
DAOS 依靠大规模分布式单端口存储.因此,每个 Target 实际上都是一个单独的失败点. DAOS 通过在不同的容错域中提供 Target 间的冗余来实现数据和元数据的可用性和持久性.DAOS 内 ...
- 前端 | JS 任务和微任务:promise 的回调和 setTimeout 的回调到底谁先执行?
首先提一个小问题:运行下面这段 JS 代码后控制台的输出是什么? console.log("script start"); setTimeout(function () { con ...
- PAT (Advanced Level) Practice 1023 Have Fun with Numbers (20 分) 凌宸1642
PAT (Advanced Level) Practice 1023 Have Fun with Numbers (20 分) 凌宸1642 题目描述: Notice that the number ...
- (二)基于商品属性的相似商品推荐算法——Flink SQL实时计算实现商品的隐式评分
系列随笔: (总览)基于商品属性的相似商品推荐算法 (一)基于商品属性的相似商品推荐算法--整体框架及处理流程 (二)基于商品属性的相似商品推荐算法--Flink SQL实时计算实现商品的隐式评分 ( ...