图论练习6

[NOIP2013]车站分级

Here

 解题思路

  • 由于起始点之间所选的站号,相互之间一定满足\geq
  • 那么对于起始点间未选择的站号,一定满足<选择的站号
  • 考虑用边来维护<信息,u\rightarrow v表示u的级别大于v
  • 按题意,则车站会被分为几个联通块,且保证块内无环,即一定存在一个有序序列
  • 则通过拓扑排序,找到连通块内的最长路径,即为最小的必要分级数


import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.BitSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.Vector;public class Main{static long md=(long)998244353;static long Linf=Long.MAX_VALUE/2;static int inf=Integer.MAX_VALUE/2;public static void main(String[] args) throws IOException{AReader input=new AReader();PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));	/** 用有向边维护大于号* 按题意,则车站会被分为几个联通块,且保证块内无环,即一定存在一个有序序列* 最长的序列即为最小的必要分级数*/int n=input.nextInt();int m=input.nextInt();boolean[][] e=new boolean[n+1][n+1];boolean[] vis=new boolean[n+1];int[] st=new int[n+1];int[] in=new int[n+1];for(int i=1;i<=m;++i) {int t=input.nextInt();Arrays.fill(vis, false);for(int j=1;j<=t;++j) {int x=input.nextInt();vis[x]=true;st[j]=x;}for(int j=st[1];j<=st[t];++j) {if(vis[j])continue;for(int k=1;k<=t;++k) {if(e[st[k]][j])continue;e[st[k]][j]=true;in[j]++;}}}Queue<Integer> q=new LinkedList<Integer>();for(int i=1;i<=n;++i)if(in[i]==0)q.add(i);int[] a=new int[n+1];Arrays.fill(a, 1);while(!q.isEmpty()) {int x=q.peek();q.poll();for(int i=1;i<=n;++i) {if(e[x][i]) {a[i]=Math.max(a[i], a[x]+1);in[i]--;if(in[i]==0)q.add(i);}}}int mx=0;for(int i=1;i<=n;++i)mx=Math.max(mx, a[i]);out.print(mx);out.flush();out.close();}//System.out.println();//out.println();staticclass 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();}}
}

P4366 [Code+#4] 最短路

Here

解题思路

  • 主要是对于i\rightarrow j,w=(i\ xor j)*c,如何处理,避免建n(n-1)条边
  •  考虑二进制
  • i\rightarrow j,可以看作是通过某些w=2^k*c的边到达
  • k=2^k,则i\rightarrow (i\ xor \ k),w=k,(i\ xor\ k)\leq n,建边
  • 然后跑最短路即可
  • 注意3\rightarrow 4\Rightarrow 3\overset{1*c}{\rightarrow}2\overset{2*c}{\rightarrow}0\overset{4*c}{\rightarrow}4,需要添一点0
  • 边总共有m+n*20
  • 洛谷该题内存不够,可以点链接去牛客交

import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;//implements Runnable
public class Main{static long md=(long)998244353;static long Linf=Long.MAX_VALUE/2;static int inf=Integer.MAX_VALUE/2;static int N=500010+20*100010;static int n=0;static int m=0;static int c=0;staticclass Edge{int fr,to,nxt;int val;public Edge(int u,int v,int w) {fr=u;to=v;val=w;}}static Edge[] e;static int[] head;static int cnt=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;}staticclass Node{int x;int y;public Node(int u,int v) {x=u;y=v;}}static int Dij(int s,int t) {int[] dis=new int[n+1];Arrays.fill(dis, inf);boolean[] vis=new boolean[n+1];dis[s]=0;PriorityQueue<Node> q=new PriorityQueue<Node>((o1,o2)->{return o1.y-o2.y;});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];}static void solve() throws Exception{AReader input=new AReader();PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));	n=input.nextInt();m=input.nextInt();c=input.nextInt();e=new Edge[m+20*n+1];head=new int[n+1];cnt=0;for(int i=1;i<=m;++i) {int u=input.nextInt();int v=input.nextInt();int w=input.nextInt();addEdge(u, v, w);}for(int i=0;i<=n;++i) {for(int j=1;j<=n;j<<=1) {int x=i^j;if(x>n)continue;addEdge(i, x, j*c);}}int s=input.nextInt();int t=input.nextInt();out.print(Dij(s, t));out.flush();out.close();}public static void main(String[] args) throws Exception{solve();}
//	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) {
//			}
//		}staticclass 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.mzph.cn/news/734209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

So you think you understand IP fragmentation?

文章目录 前言一、Why care?二、Prevention三、Well-understood?四、Introducing fragquiz五、A novel (?) algorithm六、Reader challenge七、traceroute八、ICMP参考资料 前言 本文来自&#xff1a;https://lwn.net/Articles/960913/ February 7, 2024This article was …

【Python】成功解决ModuleNotFoundError: No module named ‘seaborn’

【Python】成功解决ModuleNotFoundError: No module named ‘seaborn’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; …

高分辨率全球海洋温度和盐度再分析数据Global Ocean Physics Reanalysis(0.083°),并利用matlab读取绘图

1.引言 在研究全球海平面变化的问题中&#xff0c;卫星测高获得总的海平面变化&#xff0c;而海平面变化包含质量变化和比容变化。因此测高数据和海洋物理分析数据对于海平面研究至关重要。 测高数据下载网址&#xff1a; Global Ocean Gridded L 4 Sea Surface Heights And …

动态规划课堂4-----子数组系列

目录 引入&#xff1a; 例题1&#xff1a;最大子数组和 例题2&#xff1a;环形子数组的最大和 例题3&#xff1a;乘积最大子数组 例题4&#xff1a;乘积为正数的最长子数组 总结&#xff1a; 结语&#xff1a; 引入&#xff1a; 在动态规划&#xff08;DP&#xff09;子…

农场管理小程序|基于微信小程序的农场管理系统设计与实现(源码+数据库+文档)

农场管理小程序目录 目录 基于微信小程序的农场管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、农场信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 五、核心代码 七、最新计算机毕设选题推荐 八、源码获取&#x…

mysql和redis的区别

一.额外知识 1.为什么内存读取比硬盘读取快 在了解mysql和redis的区别之前,先来讨论一下额外的知识:为什么内存读取比硬盘读取快? 先看一个结论:内存读取至少比硬盘读取快10万倍 首先机械硬盘基本上的速度都在100MB-200MB 之间&#xff0c;SSD硬盘快一点,但是也是在500MB左右…

【工具使用-VScode】VScode如何设置空格和tab键显示

一&#xff0c;简介 在提交代码的时候&#xff0c;行末尾的tab和空格不符合规范&#xff0c;但是如果在vscode中不显示tab和空格的话&#xff0c;不能及时的查看到并改正&#xff0c;导致提交代码之后还需要再次进行修改&#xff0c;效率比较低。 代码编辑界面如图所示&#…

【大厂AI课学习笔记NO.68】开源和开源发展情况

开源即源代码公开&#xff0c;任何人能获取源代码&#xff0c;查看、修改、分发他们认为合适的代码。 依托同行评审和社区生成&#xff0c;旨在以分散、协作的方式开发。 我们曾经很详细的讨论过开源协议的问题&#xff0c;详细可以参考我的文章&#xff1a; https://giszz.…

CaricatureFace 学习笔记

目录 3d人脸重建开源项目汇总 CaricatureFace 依赖项&#xff1a; 有的电脑安装失败&#xff1a; 3d人脸重建开源项目汇总 3D人脸重建开源项目整理_reconstruction 项目-CSDN博客 2020 CVPR 漫画三维人脸重建) CaricatureFace 依赖项&#xff1a; openmesh 有的电脑安…

高频设计模式

文章目录 高频设计模式单例模式饿汉式&#xff08;Eager Initialization&#xff09;懒汉式&#xff08;Lazy Initialization&#xff09;双重校验锁&#xff08;Double-Checked Locking&#xff09;静态内部类&#xff08;Static Inner Class&#xff09;枚举&#xff08;Enum…

LeetCode-1004. 最大连续1的个数 III

每日一题系列&#xff08;day 20&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50…

软考高级:耦合分类(内容耦合、公共耦合、外部耦合等)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

docker部署在线聊天室平台Fiora

Fiora 是一款开源免费的在线聊天系统 https://github.com/yinxin630/fiora 部署 创建docker网络 docker network create fiora-networkdocker-compose部署 vim docker-compose.yml version: 3 services:fiora_redis:image: rediscontainer_name: fiora_redisrestart: alway…

Vue3 子/父组件相互调用

1&#xff1a;子组件调用父组件 父组件&#xff1a; <template><div><button style"margin: 50px">父按钮</button> <!--已clk为名称的事件传递给子组件&#xff0c;传递的是父组件的a函数/事件 --><Child clk"a" />…

huggingface实现Bark模型

目录 引言 使用半精度 使用CPU卸载 使用Better Transformer 使用Flash Attention 2 安装 使用 组合优化技术 使用技巧 BarkConfig 实例化 BarkConfig 参数说明 BarkProcessor 参数 __call__ 方法 from_pretrained 方法 save_pretrained 方法 BarkModel 生成…

电脑解锁后黑屏有鼠标--亲测!!不需要重装系统!!

问题&#xff1a;上周电脑黑屏&#xff0c;只有鼠标&#xff0c;鼠标还不能右键&#xff01;&#xff01; 中招&#xff1a;win10系统最新版火绒安全 &#xff0c;那你有概率获得开机黑屏套餐一份。 原因是&#xff1a;火绒把我们的explorer删除了导致黑屏&#xff0c;这个文…

【OpenGL手册11】材质的模型

目录 一、说明二、材质表面和光照三、设置材质四、光的属性五、不同的光源颜色练习 一、说明 在现实世界里&#xff0c;每个物体会对光产生不同的反应。比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的…

1分钟带你学会使用装饰器编写Python函数

1.需求 向 test() 函数中&#xff0c;新增一个功能&#xff0c;多输出一句话"给他补铁" def test():print("水中放吸铁石") # test()# 第一种方式&#xff1a;重写函数 def test():print("水中放吸铁石")print("给他补铁") test()# …

Hibernate是如何处理事务的?请描述一下Hibernate的事务管理。Hibernate中的缓存机制是怎样的?如何配置和使用缓存?

Hibernate是如何处理事务的&#xff1f;请描述一下Hibernate的事务管理。 Hibernate是一个强大的Java ORM框架&#xff0c;它提供了对数据库事务的透明管理。Hibernate的事务管理基于Java的JTA&#xff08;Java Transaction API&#xff09;和JDBC&#xff08;Java Database Co…

什么是移动计算?中国Java之父余胜军被刷爆的CDN又是什么?

移动计算 移动计算通常指的是将计算任务从其原始位置转移到距离数据存储地更近的地点进行处理的概念。这个概念基于一个核心原则&#xff1a;数据传输的成本&#xff08;包括时间、带宽和资源消耗&#xff09;通常高于将计算任务移动到数据所在位置的成本。因此&#xff0c;移…