拓扑排序之车站分级

news/2024/7/3 12:52:50 标签: java, 开发语言, 算法, 拓扑排序

P1983 [NOIP2013 普及组] 车站分级 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

由于Java速度的局限性,即使我写了基础的快读快输,仍然在第8个样例点处tle

大家可以自行去洛谷下载来验证

思路是这样的,我们把所有列车为停靠的车站指向已经停靠的车站,在这里,我们要记住去重,然后我们记录这些车站的先后关系。设置分级数组,默认每个车站的等级是一级,然后我们开始拓扑排序,a号车站链接的b号车站的等级等于b号的等级和a号车站的等级加1做对比取最大。

为什么呢,原因很简单,要最小的分级数量,那么我们就加一即可。

代码


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.math.MathContext;
import java.security.PublicKey;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;

import javax.sound.midi.Soundbank;
public class Main {	
  public static void main(String[] args) throws NumberFormatException, IOException  {
Scanner sc=new Scanner(System.in);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw1=new PrintWriter(System.out);
String[] aStrings=br.readLine().split(" ");
aa=Integer.parseInt(aStrings[0]);
bb=Integer.parseInt(aStrings[1]);
al1=new ArrayList[aa+1];
visited=new int[aa+1];
rudu=new int[aa+1];
answer=new int[aa+1];
cc=new int[aa+1][aa+1];
int a,b,c,d,e,f,g;
for(a=1;a<=aa;a++) {
	al1[a]=new ArrayList<>();
}
for(a=0;a<bb;a++) {//这就是用来存储边的过程
	String[] bStrings=br.readLine().split(" ");
	b=Integer.parseInt(bStrings[0]);
	c=bStrings.length;
	Arrays.fill(visited, 0);
	for(d=1;d<c;d++) {
		e=Integer.parseInt(bStrings[d]);
		visited[e]=1;
	}
	f=Integer.parseInt(bStrings[1]);
	g=Integer.parseInt(bStrings[c-1]);
	for(int a1=f;a1<=g;a1++) {
		if(visited[a1]==0) {
			for(int b1=1;b1<c;b1++) {
				int c1=Integer.parseInt(bStrings[b1]);
				if(cc[a1][c1]==0) {
					cc[a1][c1]=1;
					al1[a1].add(c1);
					rudu[c1]++;
				}
			}
		}
	}
}
tuopu();
int answer3=0;
for(int c22=1;c22<=aa;c22++) {
	answer3=Math.max(answer3, answer[c22]);
}
System.out.println(answer3);
}
public static int aa,bb;  //记录车站的数量和几条路线
public static ArrayList<Integer>[] al1;//存储边
public static LinkedList<Integer> ll1=new LinkedList<>();//存储入度为0的点
public static int[] rudu;//入度数组
public static int[] answer;//每个点的等级数组
public static int[][] cc;//判断是否已经存入a到b的一条边,这个数组是为了我们来去重边时所用
public static int[] visited;//判断一条路线中已经被经过的车站的编号
public static void tuopu() {
	int a;
	Arrays.fill(answer, 1);//初始把每个车站的等级设为1级。
	for(a=1;a<=aa;a++) {
		if(rudu[a]==0) {
		ll1.add(a);
		}
	}
	while(ll1.size()!=0) {//取出入度为0的点
		int d=ll1.remove();
		for(int c:al1[d]) {
			rudu[c]--;
			answer[c]=Math.max(answer[c], answer[d]+1);//不断更新等级
			if(rudu[c]==0) {//入度为0了,那么就继续汪队列里面添加
				ll1.add(c);
			}
		}
	}
}
}


http://www.niftyadmin.cn/n/5089067.html

相关文章

QT 网络编程 服务端 客户端 QTcpServer

服务端的创建 //创建服务端QTcpServer对象 server new QTcpServer(this);//设置服务端&#xff0c;端口&#xff0c;这里绑定的是主机的所有网卡&#xff0c; server->listen(QHostAddress::Any, 8080);//绑定连接信号与槽 connect(this->server, &QTcpServer::new…

UGUI交互组件ScrollView

一.ScrollView的结构 对象说明Scroll View挂有Scroll Rect组件的主体对象Viewport滚动显示区域&#xff0c;有Image和mask组件Content显示内容的父节点&#xff0c;只有个Rect Transform组件Scrollbar Horizontal水平滚动条Scrollbar Vertical垂直滚动条 二.Scroll Rect组件的属…

python jieba 词性标注 中文词性分类 nlp jieba.posseg

参考&#xff1a;https://blog.csdn.net/yellow_python/article/details/83991967 from jieba.posseg import dt dt.word_tag_tab[好看] >>> vflag_en2cn { ‘a’: ‘形容词’, ‘ad’: ‘副形词’, ‘ag’: ‘形语素’, ‘an’: ‘名形词’, ‘b’: ‘区别词’, ‘…

pinctrl子系统 - 架构和结构体关系(四)

一&#xff0c;pinctrl的引入 由于SoC系统越来越复杂、集成度越来越高&#xff0c;SoC中pin的数量也越来越多、功能也越来越复杂&#xff0c;这就对如何管理、使用这些pins提出了挑战。因此&#xff0c;用于管理这些pins的硬件模块&#xff08;pin controller&#xff09;就出…

【微服务】微服务初步认识 - 微服务技术如何学习 · 认识微服务架构

微服务&#xff08;1&#xff09; 文章目录 【微服务】&#xff08;1&#xff09;1. 微服务相关技术栈2. 微服务学习路线3. 认识微服务架构3.1 单体架构3.2 分布式架构3.3 微服务(架构)3.4 微服务(架构)治理落实相关的SpringCloud、SpringCloudAlibaba和阿里巴巴的Dubbo提供的服…

vue2时间处理插件——dayjs

在vue时间处理上有很多的方法和实现&#xff0c;可以自己实现&#xff0c;但是效率不高&#xff0c;所以&#xff0c;在框架开发中我们一般不会手写&#xff0c;一般是使用集成的第三方插件来解决我们的问题&#xff0c;在vue3中大家一般都使用Moment.js来处理&#xff0c;所以…

Realm violation Datapatch 禁用DBV database vault

Datapatch failed with the error ORA-47410: Realm violation for CREATE ROLE (Doc ID 2306010.1)​编辑To Bottom APPLIES TO: Oracle Database - Enterprise Edition - Version 12.1.0.2 and later Oracle Database Cloud Schema Service - Version N/A and later Oracle…

Java之SPI

Java的SPI&#xff08;Service Provider Interface&#xff09;是一种面向接口编程的机制&#xff0c;用于实现组件之间的解耦和扩展。通过SPI机制&#xff0c;我们可以定义接口&#xff0c;并允许第三方提供不同的实现&#xff0c;从而实现可插拔、可扩展的架构。 SPI讲解 它…