SPFA穿越虫洞——负权回路得判断
题目大意:穿越虫洞可以回到过去(时间--)所以能不能让时间倒流呢,就是判断有没有负权回路这次尝试用SPFA算法,也可以复习一下链式前向星
准备工作,队列q,spfa算法得有点就在于这个队列,相对于bellman_ford算法来讲,spfa算法并不是盲目得去做松弛操作,而是对队列中的点进行松弛,只要队列不空就可以从队列中拿出点来做松弛,也就死只有先松弛了队列中得点(边松弛边添加)才能去松弛其余的更远得点!
dis,vis经典数组
time数组时用来判断某个点松弛得次数得(进队列得次数)
id【】以及tot时用来链式前向星得
tot就相当于链子得每一个节点只增不减
id用来连接每一个有关得节点
#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 5050;
queue<int> q;
int dis[maxn];
int vis[maxn];
int time[maxn];
int id[maxn];
struct node{
int to;
int cost;
int pre;
}e[maxn];
int tot;
看看链式前向星,对于当前节点我记录他的数据,然后寻找相关得点的下标(前一个)id[from]然后更新id[from]
void add(int from,int to,int cost)
{
e[tot].to = to;
e[tot].cost = cost;
e[tot].pre = id[from];
id[from] = tot++;
}
算法前得初始化
void init(int n)
{
tot = 0;
for(int i = 1;i <= n;i++)
{
id[i] = -1;
dis[i] = inf;
vis[i] = time[i] = 0;
}
// memset(id,-1,sizeof(id));
// memset(dis,inf,sizeof(dis));
// memset(vis,0,sizeof(vis));
// memset(time,0,sizeof(time));
spfa算法
准备工作做好了,明白了,难得就不再spfa算法本身了
bool spfa(int s,int n)
{
vis[s] = 1;
dis[s] = 0;
q.push(s);
time[s]++; while(q.size())
{
int now = q.front();q.pop();
for(int i = id[now];~i;i = e[i].pre)
{
int to = e[i].to;
if(dis[to] > dis[now] + e[i].cost)
{
dis[to] = dis[now] + e[i].cost;
if(!vis[to])//表示这个点不在队列中
{
vis[to] = 1;
q.push(to);
if(++time[to] > n)return true;
}
}
}
vis[now] = 0;
}
return false;
}
SPFA穿越虫洞——负权回路得判断的更多相关文章
- Spfa 求含负权边的最短路 + 判断是否存在负权回路
在Bellman-Ford算法之后,我们总算迎来了spfa算法,其实就如同堆优化Dijkstra算法之于朴素版Dijkstra算法,spfa算法仅仅是对Bellman-Ford算法的一种优化,但是在形 ...
- HDU - 1317 ~ SPFA正权回路的判断
题意:有最多一百个房间,房间之间连通,到达另一个房间会消耗能量值或者增加能量值,求是否能从一号房间到达n号房间. 看数据,有定5个房间,下面有5行,第 iii 行代表 iii 号 房间的信息,第一个数 ...
- Bellman-ford算法与SPFA算法思想详解及判负权环(负权回路)
我们先看一下负权环为什么这么特殊:在一个图中,只要一个多边结构不是负权环,那么重复经过此结构时就会导致代价不断增大.在多边结构中唯有负权环会导致重复经过时代价不断减小,故在一些最短路径算法中可能会凭借 ...
- POJ 3259 Wormholes Bellman_ford负权回路
Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...
- [ACM] POJ 3259 Wormholes (bellman-ford最短路径,推断是否存在负权回路)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29971 Accepted: 10844 Descr ...
- ZOJ 3391 Haunted Graveyard(最短路负权回路)题解
题意:好长...从(0,0)走到(w-1,h-1),墓碑不能走,走到传送门只能进去不能走到其他地方,经过传送门时间会变化w(可能为负),其他地方都能上下左右走.如果能无限返老还童输出Never,走不到 ...
- bellman-ford(可判负权回路+记录路径)
#include<iostream> #include<cstdio> using namespace std; #define MAX 0x3f3f3f3f #define ...
- poj 3259 bellman最短路推断有无负权回路
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 36717 Accepted: 13438 Descr ...
- POJ 3259 Wormholes 邻接表的SPFA判断负权回路
http://poj.org/problem?id=3259 题目大意: 一个农民有农场,上面有一些虫洞和路,走虫洞可以回到 T秒前,而路就和平常的一样啦,需要花费时间走过.问该农民可不可能从某个点出 ...
随机推荐
- HTML鼠标悬浮显示隐藏 JS方法
CSS样式表: @charset "utf-8"; /* CSS Document */ .a { width:80px; height:40px; top:200px; left ...
- tomcat发布webservice
编写后台代码: package test; import javax.jws.WebParam; import javax.jws.WebService; @WebService public cla ...
- php去除bom
<?php /*检测并清除BOM*/ if(isset($_GET['dir'])){ $basedir=$_GET['dir']; }else{ $basedir = '.'; } $auto ...
- mysql数据类型长度
1个字节= 8位 tinyint 为一个字节 2的8次方= 256 所以最多存储到256 日期和时间数据类型 MySQL数据类型 含义 date 3字节,日期,格式:2014-09-18 time ...
- VMware虚拟机安装Centos预安装环境图文教程1
前言: 习惯了微软的各种可视化开发软件环境,突然接触Linux命令式的操作环境,总是会让人有些反感跟抵触的. 经过了几天的研究,发现Linux也并不是那么的深不可测.在配置网站部署环境的时候,系统集成 ...
- onsubmit return false仍提交表单
博主之前遇到这样的问题,是因为代码有错,改正之后就正常了. 但今天确定代码没错,仍然return false提交表单. 总结网上各路大神的解释: 1.onsubmit的作用是防止form只有一个inp ...
- 理解dynamic programming动态规划
何谓动态规划? 以菲波那切数列为例, int fib(int n ){ if(n == 0 || n ==1){ return 1; }else{ return fib(n - 1) + fib(n ...
- Java中的NIO及IO
1.概述 Java NIO(New IO) 是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同, ...
- php5.3 php-fpm 开启 关闭 重启
自php5.3开始,php源码中包含了php-fpm,不需要单独通过补丁的方式安装php-fpm,在源码安装的时候直接 configure 中增加参数 –enable-fpm 即可. 所以启动.关 ...
- MySQL主从复制备份
前言 数据库实时备份的需求很常见,MySQL本身提供了 Replication 机制,摘译官方介绍如下: MySQL Replication 可以将一个主数据库中的数据同步到一个或多个从数据库中.并且 ...