[ARC061E]すぬけ君の地下鉄旅行 / Snuke's Subway Trip
题目大意:Snuke的城镇有地铁行驶,地铁线路图包括$N$个站点和$M$个地铁线。站点被从$1$到$N$的整数所标记,每条线路被一个公司所拥有,并且每个公司用彼此不同的整数来表示。
第$i$条线路($1\le i \le M$)是直接连接$p_i$与$q_i$的双向铁路,中间不存在其他站点,且这条铁路由$c_i$公司所拥有。
如果乘客只乘坐同一公司的铁路,他只需要花费一元,但如果更换其他公司的铁路需要再花一元。当然,如果你要再换回原来的公司,你还是要花一元。
Snuke在1号站的位置出发,他想通过地铁去第$N$站,请求出最小钱数。如果无法到达第$N$站,输出-1。
最短路建图的好题
首先我们知道,在同一个颜色的联通块内只要一块钱就可以随意走动
那么我们就在这个联通块的入口处连一条长度为1的边,中间连长度为0的边
用map存每个颜色的入口联通块的编号,可知最多有M*2种编号
跑一遍最短路即可,注意答案要除以2(入口和出口都经过了一遍)
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<map> 6 #define M 1000010 7 using namespace std; 8 int read() 9 { 10 char ch=getchar();int x=0; 11 while(ch>'9'||ch<'0') ch=getchar(); 12 while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); 13 return x; 14 } 15 struct point{ 16 int to,next,dis; 17 }e[M<<1]; 18 int n,m,num,cnt; 19 int head[M],dis[M];bool vis[M]; 20 void add(int from,int to,int dis) 21 { 22 e[++num].next=head[from]; 23 e[num].to=to; 24 e[num].dis=dis; 25 head[from]=num; 26 } 27 void SPFA() 28 { 29 memset(dis,127,sizeof(dis)); 30 queue<int>q; 31 q.push(1); 32 vis[1]=true; 33 dis[1]=0; 34 while(!q.empty()) 35 { 36 int x=q.front(); q.pop(); 37 for(int i=head[x];i;i=e[i].next) 38 { 39 int to=e[i].to; 40 if(dis[to]>dis[x]+e[i].dis) 41 { 42 dis[to]=dis[x]+e[i].dis; 43 if(!vis[to]) 44 { 45 vis[to]=true; 46 q.push(to); 47 } 48 } 49 } 50 vis[x]=false; 51 } 52 } 53 map<pair<int,int>,int>P; 54 int get(int x,int y) 55 { 56 if(P.find(make_pair(x,y))!=P.end()) return P[make_pair(x,y)]; 57 else return P[make_pair(x,y)]=++cnt; 58 } 59 int main() 60 { 61 n=cnt=read(); m=read(); 62 for(int i=1;i<=m;i++) 63 { 64 int a=read(),b=read(),c=read(); 65 int id1=get(a,c),id2=get(b,c); 66 add(id1,id2,0); add(id2,id1,0); 67 add(a,id1,1); add(id1,a,1); 68 add(b,id2,1); add(id2,b,1); 69 } 70 SPFA(); 71 printf("%d\n",dis[n]>2*n?-1:dis[n]/2); 72 return 0; 73 }
转载于:https://www.cnblogs.com/Slrslr/p/9692607.html
[ARC061E]すぬけ君の地下鉄旅行 / Snuke's Subway Trip相关推荐
- すぬけ君の地下鉄旅行 / Snuke's Subway Trip(AtCoder-2069)
Problem Description Snuke's town has a subway system, consisting of N stations and M railway lines. ...
- すぬけ君の地下鉄旅行
题目链接:すぬけ君の地下鉄旅行 显然我们可以记录每个状态前一个状态通过的铁路.然后判断这一次边权值. 但是我们不能只用一个状态来记录,因为可能两个状态的dis相等,但是具体用哪个点更新是不确定的. 所 ...
- AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)
AtCoder Regular Contest 061 E - Snuke's Subway Trip problem 洛谷翻译 my idea 最近一直在做网络流,所以一读这题后,我就想到了最小费用 ...
- 【例题收藏】◇例题·I◇ Snuke's Subway Trip
◇例题·I◇ Snuke's Subway Trip 题目来源:Atcoder Regular 061 E题(beta版) +传送门+ 一.解析 (1)最短路实现 由于在同一家公司的铁路上移动是不花费 ...
- 【AtCoder 2069】Snuke's Subway Trip(构图方法)
题目链接:[AtCoder 2069]Snuke's Subway Trip 题目大意:有 n n n个节点,m" role="presentation" style=& ...
- すぬけ君の塗り絵 2 イージー / Snuke's Coloring 2 (ABC Edit) AtCoder - 2145
这个题就是典型的想出轮廓后,然后再具体分类,弄出各种情况 其中发现了一个新的地方,之前是要记得每次循环更新数据,这次更新数据是要判断是否更新后,然后再更新(其实就可以用max与min函数) #incl ...
- android绘制矢量图_Android矢量可绘制对象
android绘制矢量图 Everything about Vector Assets in Android 关于Android中的矢量资产的一切 介绍 (Introduction) In the b ...
- AtCoder 杂题训练
前言: 因为要普及了,今年没一等就可以退役去学文化课了,所以暑假把历年noip普及组都刷了一遍,离noip还有50+天,想弄点强化训练什么的. 想了想,就这些天学文化课之余有空就把AtCoder之前那 ...
- atcoder题目合集(持续更新中)
Choosing Points 数学 Integers on a Tree 构造 Leftmost Ball 计数dp+组合数学 Painting Graphs with AtCoDeer tarja ...
最新文章
- scrapy-redis的关键配置
- 山海树“医+药”O2O闭环 掘金8万亿市场
- HBase数据迁移到Kafka实战
- destroy 方法_线程方法destroy()和stop(Throwable)在JDK 11中删除
- Git笔记(19) 生成SSH公钥
- ibatis sql_Map中出现异常:Cause: java.lang.RuntimeException: JavaBeansDataExchange could not instantiate..
- Android第三十二期 - 辅助类Android
- 100行python代码实现细胞自动机(康威生命游戏)
- QThread 的使用
- 【军事学视频课程】《战争论》的基…
- excel就绪筛选模式_Excel自动筛选器显示筛选器模式
- 关于UCOS任务卡死的原因分析
- 你会如何给全局对象添加toString()方法
- mysql导入sql文件、数据库时报错ERROR: ASCII '\0' appeared in the statement
- Palm OS开发入门
- kaggle比赛前2%摸奖银牌总结
- 服务正在启动或停止中
- 时钟信号测到摆幅偏大是啥情况
- 解决IDM试用到期还不想使用破解版的方法
- ?id=1454320074805
热门文章
- html中地图的绘制toolbars,tkinter内嵌Matplotlib系列(二)之函数曲线绘制
- vs2015移植linux编译,windows平台移植(原linux项目)时,用vs2015开发,碰到的问题及处理方案记录...
- pytorch nn.ReLU
- python dir()
- flask-前端-requests之response对应关系 img
- 3.9 训练一个 Softmax 分类器
- 虚拟路由器冗余协议VRRP原理详解!
- 在 vCenter Server 中触发了 vSphere Distributed Switch 绑定警报 (2057667)
- Windows Server 2016补丁更新机制
- VMware vCenter升级杂谈