博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HDU 1317]XYZZY[SPFA变形][最长路]
阅读量:6279 次
发布时间:2019-06-22

本文共 2300 字,大约阅读时间需要 7 分钟。

题意:

一个图, 点权代表走到该点可获得的能量值. 可正可负. 一个人从1 号出发,带有100点能量. 问是否有一种方案可使人在能量值>0的时候走到n.

思路:

这个题首先要注意点权. 其实就是这点的所有入边的边权都等于这点的点权.

要找长路, 而非最短路. 但是可以借助最短路的算法SPFA求.

最短路的算法SFPA主要是 队列 + 松弛

松弛操作直接关系到我们运行算法的目的----求最短路

如果与该点相邻的下一个点到源的距离可以因为通过该点中转而缩短 ,则更新此下一个点到源的最短距离, 也就相当于选择了走 经过该点中转这条路.(有点dp的意思?)

如果更新成功, 则意味着刚刚被更新的这一点有可能继续更新它临接的点. (如果没有被更新的话, 那么与它邻接的点, 要么已经被更新过(靠近源的,已出队的), 要么在队列中(靠近源的,在队列中), 要么还尚未涉及(远离源的), 就算询问也不可能执行松弛操作)

而队列的优化(相对于Bellman-Ford)则是把整个松弛操作放入了BFS的框架中, 主要是使得询问顺序合理, 而这种询问顺序是通用的, 与"最短路"并不是特殊匹配的.因此在这道题中尽管是为了找正环 or 最长路, 也是放在了SFPA的框架下.

啰嗦结束~

 

#include 
#include
#include
const int MAXN=110;using namespace std;int n;int weight[MAXN];int power[MAXN];int _count[MAXN];//记录某点的入队列次数bool map[MAXN][MAXN];bool reach[MAXN][MAXN];//floyd判断任何两点是否可达void Floyd(){ for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ reach[i][j]=(reach[i][j] ||(reach[i][k]&&reach[k][j])); } } }}bool SPFA(int now){///求最长路.和求最短路的核心完全不同.只是借助了SPFA对图广搜的流程,判断正环并且避免负环 queue
Q; Q.push(now); memset(power,0,sizeof(power)); memset(_count,0,sizeof(_count)); power[1]=100; while(!Q.empty()){ int now=Q.front(); Q.pop(); _count[now]++;///统计该点入队次数 if(_count[now]>=n)return reach[now][n];//如果某个点的次数超过n次,那么说明存在正环,此时只要判断这点到n点是否可达就行了 for(int next=1;next<=n;next++){ if(map[now][next]&&power[now]+weight[next]>power[next]){ ///第一次进入时,只要不死都可以进入.第二次进入该店则必有环,那么保证不进入负环或0环 Q.push(next); power[next]=power[now]+weight[next]; } } } return power[n]>0;}int main(){ while(~scanf("%d",&n)&&n!=-1){ memset(map,false,sizeof(map)); memset(reach,false,sizeof(reach)); for(int i=1;i<=n;i++){ int num; scanf("%d%d",&weight[i],&num); for(int j=1;j<=num;j++){ int k; scanf("%d",&k); map[i][k]=true;///邻接矩阵 reach[i][k]=true;///bool可达矩阵 } } Floyd(); if(!reach[1][n]){ printf("hopeless\n"); }else { if(SPFA(1)){ printf("winnable\n"); }else printf("hopeless\n"); } } return 0;}

 

 

转载地址:http://lbiva.baihongyu.com/

你可能感兴趣的文章
jvm gc相关
查看>>
王亟亟的Python学习之路(四)-循环,条件,Range,list和tuple
查看>>
Greenplum 激活standby master失败后的异常修复
查看>>
nanomsg实验——survey
查看>>
Java设计模式(八)----代理模式
查看>>
LinkedList的用法小结
查看>>
Using mongoDB's Profiler analyze the performance of database operations
查看>>
python range() function like postgresql generate_series()
查看>>
一则优化案例
查看>>
[实践]Sonar Xcode8兼容
查看>>
Canvas应用
查看>>
node inspect chrome日志调试
查看>>
书写可维护代码的重要性
查看>>
数据库实时转移之Confluent环境搭建(二)
查看>>
(一)检测浏览器是否支持websocket
查看>>
读书笔记02-《术与道》上
查看>>
微信小程序知识点
查看>>
那些你可能不知道的搜索奇技淫巧
查看>>
译 如何做好产品经理面试工作
查看>>
[译] 伟大设计与好设计之间区别是什么?这里告诉你真相
查看>>