[ARC061E] すぬけ君の地下鉄旅行 题解

题目传送门

一些废话

今天登洛谷的时候发现主页少了一道紫题。

???怎么降绿了 (建议升蓝) ???

AND这是蒟蒻的第一篇题解

简介

  • 很容易地想到,这是一道最短路问题,要求在一个有 \(N\) 个站点和 \(M\) 条地铁线路的图中,从站点 \(1\) 到站点 \(N\) 的最小花费。
  • 每条线路由一个公司运营,乘坐同一公司的线路花费 \(1\) 元,换乘到其他公司的线路需要再花费 \(1\) 元。

思路

算法选择

这里使用 SPFA算法 来解决这个问题。SPFA 算法可以很好地处理带权图中的最短路问题,并且可以处理存在负权边的情况(虽然本题中没有负权边)。

细节处理

建图

本人特别喜欢用 链式前向星

因为它可以存各种图

void ADD(int x,int y,int z) {
	ver[++tot]=y;
	edge[tot]=z;
	Next[tot]=head[x];
	head[x]=tot;
}

//main
memset(head,-1,sizeof(head));
tot=-1;
for(int i = 1;i<=m;i++){
  scanf("%d%d%d",&x,&y,&z);
  ADD(x,y,z);
  ADD(y,x,z);
}

算法实现

  • 定义一个set,用于存储每个节点已经访问过的公司编号,这样可以避免重复计算同一种公司换乘的情况。

  • 定义Find函数,其中x是当前节点,y是要判断的边所属的公司编号。通过检查 \(num[x]\) 集合中是否包含 \(y\) 来确定是否需要换乘

bool Find(int x,int y) {
	if(num[x].count(y)){
		return 0;
	}
	else{
		return 1;
	}
}
  • 跑一遍SPFA

最终结果输出

检查 \(dist[n]\) 的值。如果无法到达站点,输出-1;否则输出 \(dist[n]\) ,即从站点 1 到站点的最小花费。

CODE

posted @ 2024-09-30 10:22  薛儒浩  阅读(58)  评论(0)    收藏  举报