原题地址: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. 搭建node.js

    #node.js:概念介绍及安装 # python服务器.php ->aphche.java ->tomcat. iis # 它是一个可以运行JAVASCRIPTR 的运行环境 # 它可以 ...

  2. 3.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:

    转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 概述 在文章:<[Spring学习笔记-MVC-3]SpringMVC返回Json数据-方 ...

  3. Shell编程实战 1.1 监控思路架构介绍

    监控思路,架构介绍 需求:使用shell定制各种个性化的告警工具,但需要统一化管理,规范化管理. 思路:指定一个脚本包,包含主程序,子程序,配置文件,邮件引擎,输出日志等. 主程序:作为脚本的入口,是 ...

  4. 使用Ping命令解析主机名解析出来的是IPv6

    如果你经常使用ping命令,并身处局域网,那么你肯定会有这样一个疑问:Ping计算机名为何是IPv6地址? 问这个问题的人很少见,大多都是对网络知识稍有了解的人,所以才会闻到关于ping的问题,而且在 ...

  5. ListView显示Sqlite的数据美化版与性能优化

    在上一篇文章中,我们已经实现在listview显示数据库内容的.但是我们listview中,排版不是很好看,所以这篇文章呢,我们来对listveiw进行美化.哈哈,说白了,就是对listview添加一 ...

  6. gym - 101673I Twenty Four, Again (表达式树枚举)

    题意及思路 模拟场上用一般方法枚举非常麻烦,一个小时没写出来,还是自己太菜了...用表达式树枚举有一个好处,判断需不需要加括号非常方便,只有当前节点运算符的优先级高于子节点的时候,才需要给子节点加一个 ...

  7. C++——explicit

    explicit构造函数是用来防止隐式转换的.请看下面的代码: class Test1 { public: Test1(int n) { num=n; }//普通构造函数 private: int n ...

  8. 将字符串str1复制为字符串str2的三种方法

    1.自己编写函数,将两个字符串进行复制 #include<iostream> using namespace std; int main(){ char str1[]="I lo ...

  9. 数字图像处理实验(4):PROJECT 02-04 [Multiple Uses],Zooming and Shrinking Images by Bilinear Interpolation 标签: 图像处理MATLAB

    实验要求: Zooming and Shrinking Images by Bilinear Interpolation Objective To manipulate another techniq ...

  10. easyUI datagrid 分页参数page和rows

    Struts2获取easyUI datagrid 分页参数page和rows 用pageHelper分页时,只要是能够获取前台传来的两个参数page和rows基本就完成了很大一部分. 获取方法:定义两 ...