题解: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\) 题解: 由于重心最多只有两个,找到重心之后以重心为根进行树哈希,找到相同哈希值的 ...
 
随机推荐
- spring boot @Scheduled 单线程的问题
			
package com.lxw.lxwDemo; import org.springframework.scheduling.annotation.EnableScheduling; import o ...
 - 看看谷歌如何在目标检测任务使用预训练权值 | CVPR 2022
			
论文提出能够适配硬件加速的动态网络DS-Net,通过提出的double-headed动态门控来实现动态路由.基于论文提出的高性能网络设计和IEB.SGS训练策略,仅用1/2-1/4的计算量就能达到静态 ...
 - RepVGG:VGG,永远的神! | CVPR 2021
			
RepVGG将训练推理网络结构进行独立设计,在训练时使用高精度的多分支网络学习权值,在推理时使用低延迟的单分支网络,然后通过结构重参数化将多分支网络的权值转移到单分支网络.RepVGG性能达到了SOT ...
 - Games101:作业6
			
说明 本次作业主要实现对上一次作业代码的重构以及使用BVH加速求交的交点判断和递归调用 代码框架的修改 有影响的改动就是框架中定义了两个结构体一个是光线ray,一个是交点Intersection 交点 ...
 - 链表栈(LinkedListStack)
			
链式栈:就是一种操作受限的单向链表,每次入栈一个元素,向链表中添加一个节点,出栈一个元素,释放一个节点.因为栈具有"后进先出"的特点,如果每次在链表的尾部进行插入和删除,就要遍 ...
 - #贪心#CF840A Leha and Function
			
题目 设 \(f(n,k)\) 表示 区间 \([1,n]\) 选出 \(k\) 个元素的集合的期望最小值, 现在需要重排 \(a\) 数组,使得 \(\sum_{i=1}^mf(a_i,b_i)\) ...
 - #Tarjan#洛谷 1407 [国家集训队]稳定婚姻
			
题目 分析 如果婚姻安全那么两个点不在同一个强连通分量, 考虑强制定方向,夫妻女向男连边,情侣男向女连边, 这样就直接用Tarjan有向图缩点就可以了 代码 #include <iostream ...
 - Lustre架构介绍的阅读笔记-基础知识
			
本文是在阅读Introduction to Lustre* Architecture的如下章节时的笔记. Lustre – Fast, Scalable Storage for HPC Lustre ...
 - 一文总结ACE代码框架
			
一.前言 ACE_Engine框架是OpenAtom OpenHarmony(简称"OpenHarmony")的UI开发框架,为开发者提供在进行应用UI开发时所必需的各种组件,以及 ...
 - 一文告诉你如何使用java调用http接口
			
程序如下: 添加apache相关maven依赖: 1 <dependency> 2 <groupId>org.apache.commons</groupId> 3 ...