题解:CF1941G Rudolf and Subway
简化题意
一个无向连通图中将边分成了不同颜色(保证同种颜色联通),问从 \(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的更多相关文章
- 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 ... 
- 【POJ】【1635】Subway Tree Systems
		树的最小表示法 给定两个有根树的dfs序,问这两棵树是否同构 题解:http://blog.sina.com.cn/s/blog_a4c6b95201017tlz.html 题目要求判断两棵树是否是同 ... 
- POJ 2502 Subway (最短路)
		Subway 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/L Description You have just moved ... 
- buaacoding_2018算法期末上机G题.地铁建设题解
		// 标注:本文旨在为博主确立一种题解的基本范式,以避免博主的题解流于AC代码的粘贴.此基本范式为:完整而简洁明了的思路及其推导说明,力图触及问题的本质并衍生对同类问题的思路分析,使得题解具有泛用性, ... 
- Subway Pursuit (二分)(交互题)
		题目来源:codeforces1039B Subway Pursuit 题目大意: 在1到n里有一个运动的点,要求找到这个点,每次可以查询一个区间内有没有这个点,每次这个点往左或者往右移动1到k个位置 ... 
- POJ2502:Subway(最短路)
		Subway Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14634 Accepted: 4718 题目链接:http ... 
- kuangbin带你飞 最短路 题解
		求一个图最短路边的办法.好像下面的那个有问题.单向边和双向边一定是有区别的.这个比较容易.参照该文的最短路网络流题目和连通图题目一题求最短路关节边 另外上述2个题目的代码好像有问题. 在UVALIVE ... 
- 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 ... 
- L - Subway(最短路spfa)
		L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ... 
- HDU5732 Subway【树重心 树哈希】
		HDU5732 Subway 题意: 给出两棵大小为\(N\)的同构树,要求输出对应的节点 \(N\le 10^5\) 题解: 由于重心最多只有两个,找到重心之后以重心为根进行树哈希,找到相同哈希值的 ... 
随机推荐
- CSS---RGBA和position属性解释
			rgb与rgba的含义 RGB 是代表Red(红色) .Green(绿色). Blue(蓝色)三个单词的缩写. RGBA 颜色值是 RGB 颜色值的扩展,添加了一个 alpha 通道, 它规定了对象的 ... 
- #动态规划#CF889E Mod Mod Mod
			题目传送门 分析 这道题有一个很妙的地方就是将一段前缀整体一起做. 设 \(dp[i][j]\) 表示\(x\) 被前 \(i\) 个数取模后答案最大,并且 \(j\) 为取得此答案的最大值 最后再对 ... 
- #树状数组,概率,离散,双指针#洛谷 6834 [Cnoi2020]梦原
			题目 分析 如果是序列(\(k=1\))也就是积木大赛 那也就是\(\sum_{i=1}^n\max\{a_i-a_{i-1},0\}\) 那关键就是要处理与父节点之间的关系,如果父节点的值小于该节点 ... 
- #trie#A 区间异或
			题目 给定一个长度为\(n\)的序列,询问有多少个\((l,r),1\leq l\leq r\leq n\)满足 \[xor_{l\leq j\leq r}a_j\geq k \] 分析 显然跑一次前 ... 
- FFmpeg开发笔记(十二)Linux环境给FFmpeg集成libopus和libvpx
			MP4是最常见的视频封装格式,在<FFmpeg开发实战:从零基础到短视频上线>一书的"1.2.3 自行编译与安装FFmpeg"介绍了如何给FFmpeg集成x264和 ... 
- OpenHarmony应用全局的UI状态存储:AppStorage
			AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储. 和AppStorage不同的是,LocalStorage是 ... 
- OpenHarmony后代组件双向同步,跨层级传递:@Provide装饰器和@Consume装饰器
			@Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景.不同于上文提到的父子组件之间通过命名参数机制传递,@Provide和@Consume摆脱参 ... 
- 华为Push用户增长服务:精准触达,加速增长
			速戳了解华为Push用户增长服务:通过精细化运营,助力开发者高效实现用户增长,提升用户活跃度和粘性! 合作咨询请点此链接 了解更多详情>> 访问华为开发者联盟官网 获取开发指导文档 华为移 ... 
- 双向链表的基本实现【数据结构与算法—TypeScript 实现】
			笔记整理自 coderwhy 『TypeScript 高阶数据结构与算法』课程 双向链表:拥有两个指针方向的链表 DoublyNode 结构: prev:指向上一个节点 value:节点值 next: ... 
- 粗心的小红qsnctfwp
			将原 apk 安装包后缀名修改为 zip 将其中的 classes3.dex 文件解压 使用 Notepad++ 或其他工具打开 classes3.dex,将第 2 行的 38 修改为 35 或 36 ... 
