G. Rudolf and Subway

解题思路

  • 每条边的边权可选,由颜色决定
  • 同一颜色的线路可以直达
  • 颜色最多有m
  • 考虑将颜色视作链接点,进行分层图跑最短路
  • u\overset{c}\leftrightarrow v\Rightarrow u\overset{1}\leftrightarrow c,c\overset{1}\leftrightarrow v
  • 最终结果除2
  • 最多建2*(n+m)条边
  • (直接存状态Map跑最短路被毙掉了)


import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TreeSet;
import java.util.Vector;








//implements Runnable
public class Main{
	static long md=(long)20020219;
	static long Linf=Long.MAX_VALUE/2;
	static int inf=Integer.MAX_VALUE/2;
	static int M=200000;
	static int N=300;
	static int n=0;
	static int m=0;
	static int k=0;
	
	static
	class Node{
		int x;
		int y;
		public Node(int u,int v) {
			x=u;
			y=v;
		}
	}
	static
	class Edge{
		int fr,to,nxt;
		int val;
		public Edge(int u,int v,int w) {
			fr=u;
			to=v;
			val=w;
		}
	}
	static Edge[] e=new Edge[4*M+1];
	static int[] head;
	static int cnt=0;
	static int col=0;
	static void addEdge(int fr,int to,int val) {
		cnt++;
		e[cnt]=new Edge(fr, to, val);
		e[cnt].nxt=head[fr];
		head[fr]=cnt;
	}
	static int Dij(int s,int t) {
		int[] dis=new int[n+col+1];
		Arrays.fill(dis, inf);
		boolean[] vis=new boolean[n+col+1];
		PriorityQueue<Node> q=new PriorityQueue<Node>((o1,o2)->{
			return o1.y-o2.y;
		});
		dis[s]=0;
		q.add(new Node(s,0));
		while(!q.isEmpty()) {
			Node now=q.peek();q.poll();
			int x=now.x;
			if(vis[x])continue;
			vis[x]=true;
			for(int i=head[x];i>0;i=e[i].nxt) {
				int v=e[i].to;
				int w=e[i].val;
				if(vis[v])continue;
				if(dis[v]>dis[x]+w) {
					dis[v]=dis[x]+w;
					q.add(new Node(v, dis[v]));
				}
			}
		}
		return dis[t];
	}
	public static void main(String[] args) throws Exception{
		AReader input=new AReader();
		PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));	
		int T=input.nextInt();
		while(T>0) {
			n=input.nextInt();
			m=input.nextInt();
			head=new int[n+m*2];
			cnt=0;
			HashMap<Integer, Integer> hs=new HashMap<Integer, Integer>();
			col=n;
			for(int i=1;i<=m;++i) {
				int u=input.nextInt();
				int v=input.nextInt();
				int c=input.nextInt();
				int x=0;
				if(hs.get(c)==null) {
					col++;x=col;
					hs.put(c, col);
				}else {
					x=hs.get(c);
				}
				addEdge(u, x, 1);
				addEdge(x, u, 1);
				addEdge(v, x, 1);
				addEdge(x, v, 1);
			}
			int s=input.nextInt();
			int t=input.nextInt();
			
			out.println(Dij(s, t)/2);
			T--;
		}
		out.flush();
	    out.close();
	}
//	public static final void main(String[] args) throws Exception {
//		  new Thread(null, new Main(), "线程名字", 1 << 27).start();
//	}
//		@Override
//		public void run() {
//			try {
//				//原本main函数的内容
//				solve();
//
//			} catch (Exception e) {
//			}
//		}
//	static 
//	class Node{
//		int x;
//		int y;
//		public Node(int u,int v) {
//			x=u;
//			y=v;
//		}
//		@Override
//	    public boolean equals(Object o) {
//	        if (this == o) return true;
//	        if (o == null || getClass() != o.getClass()) return false;
//	        Node may = (Node) o;
//	        return x == may.x && y==may.y;
//	    }
//
//	    @Override
//	    public int hashCode() {
//	        return Objects.hash(x, y);
//	    }
//	}
		static
		class AReader{ 
		    BufferedReader bf;
		    StringTokenizer st;
		    BufferedWriter bw;

		    public AReader(){
		        bf=new BufferedReader(new InputStreamReader(System.in));
		        st=new StringTokenizer("");
		        bw=new BufferedWriter(new OutputStreamWriter(System.out));
		    }
		    public String nextLine() throws IOException{
		        return bf.readLine();
		    }
		    public String next() throws IOException{
		        while(!st.hasMoreTokens()){
		            st=new StringTokenizer(bf.readLine());
		        }
		        return st.nextToken();
		    }
		    public char nextChar() throws IOException{
		        //确定下一个token只有一个字符的时候再用
		        return next().charAt(0);
		    }
		    public int nextInt() throws IOException{
		        return Integer.parseInt(next());
		    }
		    public long nextLong() throws IOException{
		        return Long.parseLong(next());
		    }
		    public double nextDouble() throws IOException{
		        return Double.parseDouble(next());
		    }
		    public float nextFloat() throws IOException{
		        return Float.parseFloat(next());
		    }
		    public byte nextByte() throws IOException{
		        return Byte.parseByte(next());
		    }
		    public short nextShort() throws IOException{
		        return Short.parseShort(next());
		    }
		    public BigInteger nextBigInteger() throws IOException{
		        return new BigInteger(next());
		    }
		    public void println() throws IOException {
		        bw.newLine();
		    }
		    public void println(int[] arr) throws IOException{
		        for (int value : arr) {
		            bw.write(value + " ");
		        }
		        println();
		    }
		    public void println(int l, int r, int[] arr) throws IOException{
		        for (int i = l; i <= r; i ++) {
		            bw.write(arr[i] + " ");
		        }
		        println();
		    }
		    public void println(int a) throws IOException{
		        bw.write(String.valueOf(a));
		        bw.newLine();
		    }
		    public void print(int a) throws IOException{
		        bw.write(String.valueOf(a));
		    }
		    public void println(String a) throws IOException{
		        bw.write(a);
		        bw.newLine();
		    }
		    public void print(String a) throws IOException{
		        bw.write(a);
		    }
		    public void println(long a) throws IOException{
		        bw.write(String.valueOf(a));
		        bw.newLine();
		    }
		    public void print(long a) throws IOException{
		        bw.write(String.valueOf(a));
		    }
		    public void println(double a) throws IOException{
		        bw.write(String.valueOf(a));
		        bw.newLine();
		    }
		    public void print(double a) throws IOException{
		        bw.write(String.valueOf(a));
		    }
		    public void print(char a) throws IOException{
		        bw.write(String.valueOf(a));
		    }
		    public void println(char a) throws IOException{
		        bw.write(String.valueOf(a));
		        bw.newLine();
		    }
		}
	}

		

	

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/452825.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】新手入门学习:详细介绍接口分隔原则(ISP)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍接口分隔原则&#xff08;ISP&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、Py…

Postman请求API接口测试步骤和说明

Postman请求API接口测试步骤 本文测试的接口是国内数智客&#xff08;www.shuzike.com&#xff09;的API接口手机三要素验证&#xff0c;验证个人的姓名&#xff0c;身份证号码&#xff0c;手机号码是否一致。 1、设置接口的Headers参数。 Content-Type&#xff1a;applicati…

三防手机与普通手机的区别在哪里?

一、三防手机和普通手机主要的区别在于其防护性能&#xff0c;它们是针对不同环境和使用场景设计的。三防手机一般包括防水、防尘和防摔三个方面的特点&#xff0c;而普通手机则往往没有这些特点。 防水性能。三防手机的防水性能通常比普通手机更强大。三防手机可以在一定程度上…

【XR806开发板试用】简单移植coremark并测试实际跑分

前言 首先&#xff0c;拿到板子的时候&#xff0c;由于xr806它是个IOT的片子&#xff0c;所以自然而然必然&#xff0c;在预想里就会有很多大佬会把文章出发点考虑在wifi/bt&#xff0c;各种物联网/WEB应用上。那么怎么另辟蹊径回避这个热点又体现出XR806的特色呢&#xff0c;…

一款好用的AI工具——边界AICHAT(三)

目录 3.23、文档生成PPT演示3.24、AI文档翻译3.25、AI翻译3.26、论文模式3.27、文章批改3.28、文章纠正3.29、写作助手3.30、文言文翻译3.31、日报周报月报生成器3.32、OCR-DOC办公文档识别3.33、AI真人语音合成3.34、录音音频总结3.35、域方模型市场3.36、模型创建3.37、社区交…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的条形码二维码检测系统(深度学习+UI界面+训练数据集+Python代码)

摘要&#xff1a;在物流和制造业中&#xff0c;开发一套高效的条形码与二维码识别系统显得尤为关键。本博文深入探讨了如何利用深度学习技术打造出一套先进的条形码及二维码检测系统&#xff0c;并且提供了一套完整的实施方案。该系统搭载了性能卓越的YOLOv8算法&#xff0c;并…

[LeetCode][LCR 175]计算二叉树的深度

题目 计算二叉树的深度 某公司架构以二叉树形式记录&#xff0c;请返回该公司的层级数。 示例 1&#xff1a; 输入&#xff1a;root [1, 2, 2, 3, null, null, 5, 4, null, null, 4] 输出&#xff1a;4 解释&#xff1a; 上面示例中的二叉树的最大深度是 4&#xff0c;沿…

【BI-Dataease】dataease设计思路

参考&#xff1a;https://juejin.cn/post/7089310768671227940 1、BI可视化工具的关键问题是什么&#xff1f; &#xff08;1&#xff09;各种数据源的数据结构和类型如何统一&#xff1f; &#xff08;2&#xff09;各种图表的配置属性不一致&#xff0c;属性如何绑定到数据…

【C++庖丁解牛】实现string容器的增删查改 | string容器的基本接口使用

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 前言&#x1f4d6;push_b…

关于stm32(CubeMX+HAL库)的掉电检测以及flash读写

1.掉电检测 CubeMX配置 只需使能PVD中断即可 但是使能了PVD中断后还需要自行配置一些PWR寄存器中的参数&#xff0c;我也通过HAL库进行编写 void PVD_config(void) {//配置PWRPWR_PVDTypeDef sConfigPVD; sConfigPVD.PVDLevel PWR_PVDLEVEL_7; …

蓝桥杯2023年第十四届省赛真题-与或异或

一共10个电门&#xff0c;穷举310次 #include<stdio.h> #include<math.h> int main(){int a[5][5], max (int)pow(3, 10), t, op, count 0;a[0][0] a[0][2] a[0][4] 1;a[0][1] a[0][3] 0;for(int k 0; k < max; k){t k;for(int i 1; i < 5; i){fo…

vite ssr服务端渲染

阅读 Vue文档 这一章里有说过&#xff0c;vue是支持服务端渲染的。 通过createSSRApp创建vue组件实例&#xff0c;并使用renderToString将在服务器渲染好template并返回字符串结构&#xff0c;通过替换占位字符将渲染好的字符串输出到html上&#xff0c;这样的一个过程就实现了…

发送短信验证码

​​​​​​【短信验证码-快速报备签名】三网短信接口-短信-短信验证码-短信服务-三网短信接口-短信-三网短信【最新版】_商业智能_电商_金融-云市场-阿里云阿里云云市场提供 专注企业短信服务10年运营与技术积累&#xff0c;稳定、安全、快速。服务&#xff0c;建站服务&…

【word技巧】word文件如何设置打开密码?可以试试这两种方法!

Word文件想要设置密码打开文件&#xff0c;我们可以给文件设置一个打开密码&#xff0c;这样只有知道密码的人才能够打开查看文件&#xff0c;今天分享两个word文件设置打开密码的方法。 一、 打开word文档后&#xff0c;点击【文件】-【信息】-【保护文档】这里有很多选项&a…

excel统计分析——一元直线回归

参考资料&#xff1a;生物统计学 两个具有因果关系的协变量如果呈直线关系&#xff0c;可以用直线回归模型来分析两个变量的关系。直线回归&#xff08;linear regression&#xff09;是回归分析中最简单的类型&#xff0c;建立直线回归方程并经检验证明两个变量存在直线回归关…

Altium Designer怎么设置默认原理图纸张大小

Altium Designer怎么设置默认原理图纸张大小 绘制原理图时我们需要设置好原理图图纸大小&#xff0c;建议大家可以将默认原理图图纸设置为A3&#xff0c;A3图纸大小可以容纳下大部分原理图&#xff0c;这样就不用每次画原理图前去修改图纸大小&#xff0c;可以提高设计效率。 …

Redis底层数据结构之Hash

文章目录 1. Redis底层hash编码格式2. Redis 6源码分析3. Redis 7源码分析 1. Redis底层hash编码格式 在redis6中hash的编码格式分别是ziplist&#xff08;压缩列表&#xff09;和hashtable&#xff0c;但在redis7中hash的编码格式变为了listpack&#xff08;紧凑列表&#xf…

如何不依赖Unity直接解压unitypackage的内容

使用场景 我们都知道unity的资源导出是导出成.unitypackage文件,如果要里面的内容,得打开Unity,将unitypackage导入进去才能看到里面的内容。 但是很多时候我们下了几十个unitypackage资源包,又不清楚好不好用,而且导入之后编译特别慢,unity又不提供批量解压的功能,所…

好消息!电商平台订单API同步订单详情信息免申请审核调用指南!

淘宝开放平台订单类API 测试key获取 拼多多开放平台订单API列表 custom-自定义API操作 taobao.custom/pinduoduo.custom 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&…

day08-Mybatis入门

MyBatis 是一款优秀的 持久层 框架&#xff0c;用于简化 JDBC 的开发。 官网&#xff1a;https://mybatis.org/mybatis-3/zh/index.html 一、快速入门 1.1 Mybatis 操作数据库的步骤 准备工作(创建 springboot 工程、数据库表 user、实体类 User)引入 Mybatis 的相关依赖&…
最新文章