原题地址:http://poj.org/problem?id=1847

Tram:有轨电车

这题就是构造一个有向无权图,然后每一个点都会有一个开关,这个开关指向他的其中一个出度。当途经这个点的时候,如果要从开关指向的边离开,则没事,如果不从开关指向的边离开,那么就要下车把开关掰到要离开的那条边上去。注意,离开之后那个开关是不会“弹”回去的。这跟现实铁路中的道岔还挺像。

这里我们用邻接表+SPFA来实现。注意是没有边权的。然后加了个switched数组,switched[i]表示第i个点开关指向的边的编号。在松弛代码中,我们会用到这个玩意儿。SPFA算法的队列使用STL的队列(手打队列麻烦)

注意最后不连通的判断,因为图是没有负权的(因为你最低也就是0,不可能走一圈下来掰了-1次开关吧),所以不用判断点是否入队超N次。不连通说明肯定没有搜到终点,终点的d数组肯定也没有被更新,所以就 判断是否为INF(0x3f3f3f3f)就能判断是否连通。

代码:

//Accepted
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
queue<int>q;
struct Edge
{
int v,next;
}a[10010];
int n,m=0,src,dest,tmp,tmp2,link[1010],d[1010],switched[1010];
bool visit[1010];
void addedge(int s,int d)
{
m++;
a[m].v=d;
a[m].next=link[s];
link[s]=m;
}
void spfa()
{
q.push(src);
d[src]=0;
visit[src]=true;
while(!q.empty())
{
int x=q.front();
q.pop();
visit[x]=0;
for(int i=link[x];i!=0;i=a[i].next)
{
if(d[x]+(switched[x]==a[i].v?0:1)<d[a[i].v])
{
d[a[i].v]=d[x]+(switched[x]==a[i].v?0:1);
if(visit[a[i].v]==false)
{
visit[a[i].v]=true;
q.push(a[i].v);
} }
}
}
}
int main()
{
memset(d,0x3f,sizeof(d));
scanf("%d%d%d",&n,&src,&dest);
for(int i=1;i<=n;i++)
{
scanf("%d",&tmp);
for(int j=1;j<=tmp;j++)
{
scanf("%d",&tmp2);
if(j==1)switched[i]=tmp2;
addedge(i,tmp2);
}
}
spfa();
if(d[dest]==0x3f3f3f3f)printf("-1\n");
else
printf("%d\n",d[dest]);
return 0;
}

POJ1847 Tram SPFA算法变形的更多相关文章

  1. poj1847 Tram(Dijkstra || Floyd || SPFA)

    题目链接 http://poj.org/problem?id=1847 题意 有n个车站,编号1~n,每个车站有k个出口,车站的出口默认是k个出口中的第一个,如果不想从默认出口出站,则需要手动选择出站 ...

  2. 最短路径问题的Dijkstra和SPFA算法总结

    Dijkstra算法: 解决带非负权重图的单元最短路径问题.时间复杂度为O(V*V+E) 算法精髓:维持一组节点集合S,从源节点到该集合中的点的最短路径已被找到,算法重复从剩余的节点集V-S中选择最短 ...

  3. [知识点]SPFA算法

    // 此博文为迁移而来,写于2015年4月9日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vx93.html 1.前言 ...

  4. SPFA算法

    SPFA算法 一.算法简介 SPFA(Shortest Path Faster Algorithm)算法是求单源最短路径的一种算法,它是Bellman-ford的队列优化,它是一种十分高效的最短路算法 ...

  5. SPFA算法学习笔记

    一.理论准备 为了学习网络流,先水一道spfa. SPFA算法是1994年西南交通大学段凡丁提出,只要最短路径存在,SPFA算法必定能求出最小值,SPFA对Bellman-Ford算法优化的关键之处在 ...

  6. 用scheme语言实现SPFA算法(单源最短路)

    最近自己陷入了很长时间的学习和思考之中,突然发现好久没有更新博文了,于是便想更新一篇. 这篇文章是我之前程序设计语言课作业中一段代码,用scheme语言实现单源最段路算法.当时的我,花了一整天时间,学 ...

  7. SPFA算法心得

    SPFA算法是改进后的Bellman-Ford算法,只是速度更快,而且作为一个算法,它更容易理解和编写,甚至比Dijkstra和B-F更易读(当然,Floyd是另一回事了,再也没有比Floyd还好写的 ...

  8. 最短路径--SPFA 算法

    适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...

  9. Bellman-Ford & SPFA 算法——求解单源点最短路径问题

    Bellman-Ford算法与另一个非常著名的Dijkstra算法一样,用于求解单源点最短路径问题.Bellman-ford算法除了可求解边权均非负的问题外,还可以解决存在负权边的问题(意义是什么,好 ...

随机推荐

  1. ThreadPoolExecutor的corePoolSize和maximumPoolSize

    按照JDK文档的描述, 如果池中的实际线程数小于corePoolSize,无论是否其中有空闲的线程,都会给新的任务产生新的线程 如果池中的线程数>corePoolSize and <max ...

  2. ruby 异常处理

    begin raise 'A test exception.' rescue Exception => e puts e.message puts e.backtrace.inspect end

  3. python正则以及collections模块

    正则 一.认识模块  什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 : 1.使用python编写的代码(.p ...

  4. SQLServer数据库中开启CDC导致事务日志空间被占满的原因

    SQLServer数据库中开启CDC导致事务日志空间被占满的原因 转载  2017-04-01   投稿:mrr    我要评论 这篇文章主要介绍了SQLServer数据库中开启CDC导致事务日志空间 ...

  5. CentOS 6.3安装jdk(笔记整理)

    1. 下载bin文件,切忌oracle上现在下载到的旧版本的jdk的bin都是网页(执行会报错,见本文最后的截图),他们需要登录oracle后才能下载,所以我这里的url是从googlecode里觅来 ...

  6. css背景图片位置:background的position(转)

    css背景图片位置:background的position   position的两个参数:水平方向的位置,垂直方向的位置----------该位置是指背景图片相对于前景对象的 1.backgroun ...

  7. Opencv Laplacian(拉普拉斯算子)

    #include <iostream>#include <opencv2/opencv.hpp>#include <math.h> using namespace ...

  8. ZROI2018提高day5t2

    传送门 分析 考场上傻了,写了个树剖还莫名weila...... 实际就是按顺序考虑每个点,然后从他往上找,一边走一边将走过的边染色,如果走到以前染过色的边就停下.对于每一个a[i]的答案就是之前走过 ...

  9. Java_枚举类

    枚举类 枚举类不出来的时候只能如下写代码 //Student.java package cn.itcast.enumeration; public class Student { private St ...

  10. Laradock使用教程(新手版)

    Laradock使用教程 背景 最近我们公司把开发环境从windows系统换到了Ubuntu系统.用windows系统的时候,我们一般用phpStudy集成环境的比较多.换到Linux环境下,我们选择 ...