原题链接

简化题意

一个无向连通图中将边分成了不同颜色(保证同种颜色联通),问从 \(b\) 到 \(e\) 最短需要经过几种颜色

思路

考虑因为同种颜色联通,可直接在读入的时候开两个 vector 分别存每个点属于的颜色及每种颜色有哪些点,又因为颜色数字可能跨度比较大,最好另开一个存颜色的种类

然后就是从 \(b\) 开始 BFS ,对每个点遍历它直连的所有颜色种类,然后遍历属于该颜色的所有点

小优化

发现存颜色的时候会将一条边连着的两个点都存进去,存点同理,也就是一个点可能会被同颜色存很多次且可能存很多个同颜色,这里开两个 map 去重可以大大降低复杂度

注意!!!

因为 codeforces 上可以 hack 别人的代码,所以赛后数据有卡 hash 表的,建议观看 这篇

CF 大佬的博客,防止自己的 hash 表被卡

开两个数组存遍历过的颜色块和节点,复杂度显然是线性的

代码

#include<bits/stdc++.h>
//#include<ext/pb_ds/assoc_container.hpp>
//#include<ext/pb_ds/hash_policy.hpp>
#define ll long long
using namespace std;
//using namespace __gnu_cxx;
//using namespace __gnu_pbds; struct custom_hash {
static uint64_t splitmix64(uint64_t x) {
// http://xorshift.di.unimi.it/splitmix64.c
x += 0x9e3779b97f4a7c15;
x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
return x ^ (x >> 31);
} size_t operator()(uint64_t x) const {
static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
return splitmix64(x + FIXED_RANDOM);
}
}; const int N=4e5+10;
int T,n,m,b,e,ans;
bool fc[N],fl[N],fd[N];
queue<pair<int,int>>q;
vector<int>col[N],v[N],vec;
unordered_map<int,bool,custom_hash>mp1;
unordered_map<long long,bool,custom_hash>mp2;
inline void init()
{
while(!q.empty())
q.pop();
for(auto it : col[e])
fl[it]=false;
for(int i=1;i<=n;i++)
{
fd[i]=false;
col[i].clear();
}
for(auto it : vec)
{
fc[it]=false;
v[it].clear();
}
ans=1e9;
vec.clear();
mp1.clear();
mp2.clear();
return ;
}
inline void bfs(int x,int t)
{
fd[x]=true;
q.push({x,t});
while(!q.empty())
{
x=q.front().first;
t=q.front().second;
q.pop();
for(auto i : col[x])
{
if(fc[i])
continue;
if(fl[i])
{
ans=min(ans,t);
return ;
}
fc[i]=true;
for(auto j : v[i])
if(!fd[j])
{
fd[j]=true;
q.push({j,t+1});
}
}
}
return ;
}
int main()
{
cin>>T;
while(T--)
{
init();
scanf("%d%d",&n,&m);
for(int i=1,x,y,c;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&c);
if(mp1.find(c)==mp1.end())
{
mp1[c]=1;
vec.push_back(c);
}
if(mp2.find(((ll)x<<32)|c)==mp2.end())
{
mp2[((ll)x<<32)|c]=1;
v[c].push_back(x);
col[x].push_back(c);
}
if(mp2.find(((ll)y<<32)|c)==mp2.end())
{
mp2[((ll)y<<32)|c]=1;
v[c].push_back(y);
col[y].push_back(c);
}
}
scanf("%d%d",&b,&e);
if(b==e)
{
printf("0\n");
continue;
}
for(auto it : col[e])
fl[it]=true;
bfs(b,1);
printf("%d\n",ans);
}
return 0;
}

题解:CF1941G Rudolf and Subway的更多相关文章

  1. 2016 Multi-University Training Contest 1 J.Subway

    Subway Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Su ...

  2. 【POJ】【1635】Subway Tree Systems

    树的最小表示法 给定两个有根树的dfs序,问这两棵树是否同构 题解:http://blog.sina.com.cn/s/blog_a4c6b95201017tlz.html 题目要求判断两棵树是否是同 ...

  3. POJ 2502 Subway (最短路)

    Subway 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/L Description You have just moved ...

  4. buaacoding_2018算法期末上机G题.地铁建设题解

    // 标注:本文旨在为博主确立一种题解的基本范式,以避免博主的题解流于AC代码的粘贴.此基本范式为:完整而简洁明了的思路及其推导说明,力图触及问题的本质并衍生对同类问题的思路分析,使得题解具有泛用性, ...

  5. Subway Pursuit (二分)(交互题)

    题目来源:codeforces1039B Subway Pursuit 题目大意: 在1到n里有一个运动的点,要求找到这个点,每次可以查询一个区间内有没有这个点,每次这个点往左或者往右移动1到k个位置 ...

  6. POJ2502:Subway(最短路)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14634   Accepted: 4718 题目链接:http ...

  7. kuangbin带你飞 最短路 题解

    求一个图最短路边的办法.好像下面的那个有问题.单向边和双向边一定是有区别的.这个比较容易.参照该文的最短路网络流题目和连通图题目一题求最短路关节边 另外上述2个题目的代码好像有问题. 在UVALIVE ...

  8. Codeforces Beta Round #95 (Div. 2) D. Subway 边双联通+spfa

    D. Subway   A subway scheme, classic for all Berland cities is represented by a set of n stations co ...

  9. L - Subway(最短路spfa)

    L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...

  10. HDU5732 Subway【树重心 树哈希】

    HDU5732 Subway 题意: 给出两棵大小为\(N\)的同构树,要求输出对应的节点 \(N\le 10^5\) 题解: 由于重心最多只有两个,找到重心之后以重心为根进行树哈希,找到相同哈希值的 ...

随机推荐

  1. 腾讯tvp之路

    王清培 腾讯tvp之路

  2. OpenHarmony Meetup 2023北京站圆满举办

      "OpenHarmony正当时"OpenHarmony Meetup 2023城市巡回活动,旨在通过meetup线下交流形式,解读OpenHarmony作为下一代智能终端操作系 ...

  3. 【FAQ】HMS Core推送服务推送角标的开发及常见问题解答

    目录 1.发送消息并显示桌面数字角标. 2.如何清除数字角标? 3.如何设置圆点角标? 4.应用桌面图标角标开关无法开启或未显示开关. 5.推送消息设置了角标字段但未显示角标? 6.未设置角标参数,但 ...

  4. PMF源解析技术在大气颗粒物与VOCs研究中的创新应用

    目前,大气颗粒物和臭氧污染成为我国亟待解决的环境问题.颗粒物和臭氧污染不仅对气候和环境有重要影响,而且对人体健康有严重损害.而臭氧的前体物之一为挥发性有机物(VOCs).为了高效.精准地治理区域大气颗 ...

  5. 深入理解MD5算法:原理、应用与安全

    第一章:引言 导言 在当今数字化时代,数据安全和完整性变得至关重要.消息摘要算法是一种用于验证数据完整性和安全性的重要工具.在众多消息摘要算法中,MD5(Message Digest Algorith ...

  6. 选择排序的基本实现【数据结构与算法—TypeScript 实现】

    笔记整理自 coderwhy 『TypeScript 高阶数据结构与算法』课程 概念 本质:两两元素相比较,先扫描一遍未排序数列,把未排序的数列中的最小(大)元素,放到数列的已排序的末尾 特性 选择排 ...

  7. 外屏和宽屏浪费了?HarmonyOS折叠屏设计规范教你用起来

    原文:https://mp.weixin.qq.com/s/7_mdRom7sCA3Z65ih6W3xw,点击链接查看更多技术内容. 这几年折叠屏手机很火,我们针对使用HarmonyOS的折叠屏手机提 ...

  8. HH的项链—树状数组

    题目描述 HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义. HH不断地收集新的贝壳,因此他的项链变得越来越长.有一天 ...

  9. Godot.NET C#IOC重构(2):TileMap 详解

    目录 前言 TileMap添加 TileMap绘制 TileMap 连续图块 修改纹理原点 统一设置 自动地形 匹配规则 修改匹配概率 修改概率前 修改概率后 随机图块 Scattering 不连续间 ...

  10. HTTP 使用指南

    0x1 初识 HTTP 协议 网页加载流程 graph LR A(user 输入网址)==>B(browser 进程) B==>C(处理输入信息) B-->D(页面加载完成) C== ...