Walk 题解【拆点+最短路】

本文介绍了有向图最短路问题,背景是比特镇的街区交通系统,其中道路根据编码特点建立。给出了输入输出格式,以及部分分和AC两种解决方案,涉及BFS和图的拆点技巧。AC做法通过优化边的数量,降低了空间需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简述

给定一张有n个点的有向图,点i 的权值为val_i,若 val_i and val_j =val_j,则i 向j 连边。另外再给定m条有向边,假设边权都是1,求1到每个点的最短路。

背景

在比特镇一共有n个街区,编号依次为1到n,它们之间通过若干条单向道路连接。比特镇的交通系统极具特色,除了m条单向道路之外,每个街区还有一个编码val i,不同街区可能拥有相同的编码。如果val i and val j =val j,即val i 在二进制下与val j 做与运算等于val j,那么也会存在一条额外的从i 出发到j 的单向道路。
Byteasar现在位于1号街区,他想知道通过这些道路到达每一个街区最少需要多少时间。因为比特镇的交通十分发达,你可以认为通过每条道路都只需要1单位时间。

Input

第一行包含两个正整数n, m,表示街区的总数以及道路的总数。
第二行包含n个正整数val_1,val_2,… val_n,分别表示每个街区的编码。接下来m行,每行包含两个正整数u_i,v_i,表示一条单向道路,起点为u_i,终点为v_i。

Output

输出n行,每行一个整数,其中第i行输出到达第i个街区的最少时间,如果无法到达则输出-1。

Examples

walk.in walk.out
5 2 0
5 4 2 3 7 1
1 4 2
2 3 1
-1

Notes

这里写图片描述

部分分做法

  1. 20分做法:暴力最短路
  2. 40分做法:按照题目要求建好图,然后BFS求出1到每个点的最短路
    即可。时间复杂度O(n^2+m)。
  3. 考虑新增2^15个点,这些点中i 向它所有的子集连一条权值为0的有向边。对于原来的n个点,先把m条边连好,然后对于i号点,由它向新增的第val_i 个点连一条权值为1的有向边,再由新增的第val_i 个点向它连一条
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值