题目链接

POJ-1847

题意

给定n节点,节点之间有道路相连,但是每个节点都有个开关,只有开关指向的节点才能通行,你可以搬动开关。给定起点终点,求最少搬动开关次数。

解法

建图,对于每个节点,初始开关对准的节点连边,权值为0,代表经过这个边不需要动开关。对于其他链接的节点连边,权值为1,代表经过这个边需要动开关。跑一遍起点到终点最短路,dis数组求出来的就是最少搬动开关次数。

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#include<cstdio>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
using namespace std;typedef long long ll;const int maxn=550;const int maxe=5050;const int inf=0x3f3f3f3f;struct Edge{int v,w,next;}edge[maxe];int head[maxn],cnt;bool vis[maxn];int in[maxn];int dis[maxn];int n,m;void init(){memset(head,-1,sizeof(head));cnt=0;}void add(int u,int v,int w){edge[cnt].v=v;edge[cnt].next=head[u];edge[cnt].w=w;head[u]=cnt;cnt++;}bool spfa(int s) {memset(vis,0,sizeof(vis));memset(in,0,sizeof(in));memset(dis,0x3f,sizeof(dis));queue<int>q;q.push(s);vis[s]=true;in[s]++;dis[s]=0;while(q.size()) {int p=q.front();q.pop();vis[p]=false;for(int i=head[p];i!=-1;i=edge[i].next) { //SPFAint v=edge[i].v;if(dis[v]>edge[i].w+dis[p]) {dis[v]=edge[i].w+dis[p];in[v]++;if(in[v]>=n)return true;//这个点更新了多于n次,说明存在负环 if(!vis[v]) {vis[v]=true;q.push(v);}}}}return false;}int main(){IOSinit();int s,t;cin>>n>>s>>t;for(int i=1;i<=n;i++){int tmp,v;cin>>tmp;if(!tmp)continue;tmp--;cin>>v;add(i,v,0);while(tmp--){cin>>v;add(i,v,1);}}spfa(s);if(dis[t]!=inf)cout<<dis[t]<<endl;elsecout<<"-1"<<endl;} 

POJ - 1847 Tram 最短路,思维建图相关推荐

  1. CodeForces - 1529F It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!(最短路+思维建图)

    题目链接:点击查看 题目大意:给出 nnn 个点(从 000 开始编号)和 mmm 条边的有向带权图,不过 mmm 条边是动态的,经过 ttt 秒后,第 iii 条边就从 ai−>bi,cia_ ...

  2. HDU 4725 层级最短路 思维建图 邻接表 堆优化迪杰斯特拉 真的难想 区域网络赛真题

    题目 题解思路 知道是最短路,怎么建图呢? 一开始想到每层来一个超级源点,但是方向不知道怎么确定,用双向边果然WA了(如果是双向边,那一层的都会变成0费连通了 ). 翻了翻 大佬的博客 大佬定义了一种 ...

  3. CodeForces - 1422D Returning Home(最短路+思维建图)

    题目链接:点击查看 题目大意:给出一个 n * n 的二维平面,现在要从点 ( sx , sy ) 到达点 ( fx , fy ),在平面上有 m 个传送门,共有两次操作: 向上.下.左.右移动一个单 ...

  4. POJ - 1847 Tram(最短路)

    题目链接:点击查看 题目大意:火车从起点开到终点,轨道上有很多岔路口,每个岔路口都有很多方向(火车能够选择任意一个方向行驶),但是默认 的是第一个方向,如果要选择其他的方向需要增加一次切换的操作,问最 ...

  5. poj 1847 Tram 最短路 dijkstra、floyed

    文章目录 Dijkstra算法: AC的代码: WA的代码: Floyed代码: 我实在是找不到dijkstra的写法哪里错了,哭了,样例还有自己编的数据都没问题,但是就是WA,放弃 = = 第二天到 ...

  6. 男生和女生(思维建图,最大独立集问题)

    男生和女生(思维建图,最大独立集问题) 问题描述 在大学二年级,一些人开始了同学之间罗曼蒂克关系的研究.有"罗曼蒂克"关系是针对男生和女生之间的关系而言的.研究的原因是找到满足以下 ...

  7. 小雨坐地铁--[最短路分层建图+虚点]

    也是第一次接触这种分层建图的最短路 思路:由题目我们可以知道某些站点是可以连接好几条地铁线路的,那么对于每条地铁线路我们可以把他当成一幅图来算.当然图是个无向图,所以要加两次边. add(i*n+x, ...

  8. 算法提高课-图论-单源最短路的建图方式-AcWing 920. 最优乘车:bfs求最短路、建图

    题目分析 来源:acwing 分析: 本题难在抽象建图上,这里采用的建图方式是:同一条公交线路上,前面的站点都可以连一条有向边到其后面的站点,且边权都为1. 由于边权都是1,可以用bfs来求最短路. ...

  9. POJ - 3281 Dining(最大流+思维建边)

    题目链接:点击查看 题目大意:给出n头奶牛,f种食物,d种饮料,每只奶牛可以选择数种食物和饮料,但每种食物和饮料只有一份,现在问最多能让多少头奶牛同时满足食物和饮料的条件 题目分析:最大流的题目,不过 ...

最新文章

  1. 有道精品课python-115批量转存与提取sha1工具2020下载
  2. CentOS下启动oracle数据库(转)
  3. Golang判断元素是否存在数组中
  4. MacOS中安装OpenCV
  5. 中小企业利用VRRP实现链路负载均衡
  6. 使用container的嵌套_ElementUI 技术揭秘(4)— Container 布局容器组件的设计与实现。...
  7. Silkroad 与 Tesseract 通信协议 QuestionModel
  8. 数据结构严蔚敏版课后答案
  9. 实时渲染——三种渲染方法介绍
  10. Javassist-手写字节码文件
  11. 强烈推荐APP破解常用工具集合!最强总结
  12. RabbitMQ整合SpringCloud
  13. Linux:shel脚本调试及环境问题l
  14. html5对锚的更改,HTML5之锚链接
  15. 什么除酵节?什么是逾越节?
  16. 续集来了:上回那个“吃鸡”成功的IC人后来发生了什么?
  17. 清北学堂模拟赛d3t6 c
  18. Vue.js基础(极简、自用)
  19. python自动生成采集规则_快速制作规则及获取规则提取器AP
  20. soc验证 c语言,一种Soc芯片验证方法与流程

热门文章

  1. 使用redis存储对象,取对象时的一些常见异常
  2. 集装箱交接清单(CTNJJD)
  3. SQL面试常考知识点
  4. 车载蓝牙通话前声道才有声音背后的原因
  5. 初识面向对象二(继承/抽象/C3)
  6. python理想低通滤波、巴特沃斯低通滤波、高斯低通滤波实现
  7. vue-quill-editor富文本 上传图片可调节图片大小
  8. C++各大有名库的介绍
  9. ASP.NET培训资料(课堂视频)(AJAX,C#,JavaScript,SQL)
  10. C++综合案例练习--景区旅游信息管理系统