给定一个n个点,m条边的无向图,第i条边表示x,y是z号线的相邻站点,问s到t最少需要换乘多少次
用分层图,对于任意一条线路,让他们单独分为一层,如果一个点既在1号线又在2号线,那么它应该处于两个图层中,举个例子
在这个例子中显然1,2,3,4可以在一个图层中,同时1,3又可以在第二个图层中,分层的目的是为了,如果它需要去另一个图层,说明他一定要换乘(当前节点跳到另一个图层的当前节点不算),那么可以多创造一些'分身',来表示多个图层中都包含某个点,建边不按原来的建,而是首先要自己向自己的所有分身去建边保证可以由这个点换乘到其他图层中去,然后每个图层之间点,按照原来的关系去建边,然后令自己到分身长度为0,图层之间建边长度为0,由分身到本体的长度为1,最后跑最短路即可。
#include <map>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
typedef long long LL;
using namespace std;
const int maxn = 2e5+6,inf = 1e9;
int T,n,m,cnt,head[maxn*3],dis[maxn*3];
bool vis[maxn*3];
struct qwq{
int to,len,next;
}edge[maxn*6];
struct node{
int id,dist;
bool operator < (const node &x)const
{
return dist > x.dist;
}
};
priority_queue <node> q;
struct p{
int fi,se;
bool operator < (const p &x)const
{
return fi == x.fi ? se < x.se : fi < x.fi;
}
};
map <p,int> mp;
inline void add(int u,int v,int w)
{
cnt ++;
edge[cnt].to = v;
edge[cnt].len = w;
edge[cnt].next = head[u];
head[u] = cnt;
return ;
}
int main()
{
scanf("%d",&T);
while(T --)
{
cnt = 0; mp.clear();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y,z,nx,ny;
scanf("%d%d%d",&x,&y,&z);
if(!mp[{x,z}])
{
mp[{x,z}] = ++n;
nx = n;
add(nx,x,1);
add(x,nx,0);
}
else nx = mp[{x,z}];
if(!mp[{y,z}])
{
mp[{y,z}] = ++n;
ny = n;
add(ny,y,1);
add(y,ny,0);
}
else ny = mp[{y,z}];
add(nx,ny,0);
add(ny,nx,0);
}
for(int i=1;i<=n;i++)
{
dis[i] = inf;
vis[i] = 0;
}
int b,e;
scanf("%d%d",&b,&e);
dis[b] = 0;
q.push((node){b,0});
while (!q.empty())
{
int u = q.top().id; q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i=head[u];i;i=edge[i].next)
{
int v = edge[i].to;
if(dis[v] > dis[u] + edge[i].len)
{
dis[v] = dis[u] + edge[i].len;
q.push((node){v,dis[v]});
}
}
}
for(int i=1;i<=n;i++) head[i] = 0;
printf("%d\n",dis[e]);
}
return 0;
}
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话