图论(四大容器)拓扑排序 从入门到入坑 完整版

本文介绍了图论的基本概念,包括顶点、边和度,并详细讲解了图论中的四大容器——List、Set、Map和Queue的接口及其常见实现类。接着,文章深入探讨了图的建立方法,如邻接矩阵、邻接链表和前向星,并提供了无权值和带权值的代码实现。最后,重点讨论了拓扑排序的概念、条件、实现方法,并给出了两个具体的例题:旅行计划和最长路问题。
摘要由CSDN通过智能技术生成

图论:

要素:

顶点(Vertex) 边(Edge) 边权(Weight)**

无向图:边数
有向图:出度和入度

树为一种比较特殊的图

四个基本容器

基本的容器有四个,分别对应四个接口:

List:按照插入的顺序保存元素,可以有重复的元素。
Set:不可以有重复的元素,可以理解为哈希表。
Queue:按照队列规则先进先出。
Map:将两个元素相关联,可以用键来查找值。

其中List、Set、Queue这三个接口继承了Collection接口。

Map则是自成一家,没有继承别人。
在这里插入图片描述

各接口的常用实现类

List:ArrayList、LinkedList
Set:HashSet、TreeSet、LinkedHashSet
Map:HashMap、TreeMap、LinkedHashMap
Queue:PriorityQueue、LinkedList

ArrayList和LinkedList这两个是实现类,实现了List接口,这两个类可能会增加一些接口没有的新方法(刷题时一般用不到)。

同理、Set、Queue、Map的实现类也一样。

1,类的定义方式:

如果需要用到一个List容器可以像下面这样子定义

ArrayList<Integer> list = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
List<Integer> list = new ArrayList<>();//接口实现的对象方法少一点
ArrayList<Integer> list = new ArrayList<>()//类实现的对象多一点

Set和Map和Queue的定义也和list一样。

List容器

ArrayList:底层使用数组实现的,查找快,插入数据和删除数据慢(常用)
LinkedList:底层使用链表实现的,查找慢,插入数据和删除数据快(常用)

1,创建一个List容器

List<Integer> list = new ArrayList<>()ArrayList<Character> hui=new ArrayList<>();

 ArrayList<String> ans=new ArrayList<>();
 ans.add("qiao ben zhong.\n");//可以实现加入回车
 
 ArrayList[] arrayList = new ArrayList[n];
 //每一个一维数组都要实例化
 for(int i=0;i<n;i++)
		{
   
			a[i]=new ArrayList<>();
		}
 for (int j = 0; j < arrayList[i].size(); j++) 

List(可用arraylist也可以用linkedlist)常用方法有

arrayList[i].get(j)//二维数组
list.add(int element)//添加元素(常用)
list.get(int index)//根据索引查找元素
list.size()//反回元素的数量(常用)
list.isEmpty()//判断是否为空(常用)
list.remove()//根据下标删除元素
list.clear();//清空元素

2,模拟栈:

		LinkedList<Integer> a=new LinkedList<>();
		a.add(12);a.add(13);a.add(133);a.add(21);
		int z=a.get(a.size()-1);//返回栈顶元素
		a.remove(a.size()-1);//清除栈顶元素
		System.out.println(a);

2,模拟队列:

		LinkedList<Integer> b=new LinkedList<>();//队列
		b.add(1);b.add(3);b.add(12);
		int x=b.poll();//返回队首元素,删除队首元素
		int y=b.peek();//返回队首元素
		b.removeFirst();//直接删除队首元素
		System.out.println(b);

Stack容器

//创建堆栈对象
			Stack stack=new Stack();
			System.out.println("aaaa,bbbb,cccc三个元素入栈");
			//向栈中压入字符串aaaa
			stack.push("aaaa");
			//显示栈中的所有元素
			printStack(stack);
			stack.push("bbbb");
			printStack(stack);
			stack.push("cccc");
			printStack(stack);
			String s=new String("aaaa");
			System.out.println("元素aaaa在堆栈的位置"+stack.search(s));
			s=new String("bbbb");
			System.out.println("元素bbbb在堆栈的位置"+stack.search(s));
			System.out.println("aaaa,bbbb,cccc三个元素出栈");
			System.out.println("元素"+stack.pop()+"出栈");
			printStack(stack);
			System.out.println("元素"+stack.pop()+"出栈");
			printStack(stack);
			System.out.println("元素"+stack.pop()+"出栈");
			printStack(stack);
			
		}

Set容器(可去重)

Set接口实现类有
HashSet:使用散列函数查找快速(也就是常说的哈希查找)(常用)
TreeSet:排序默认从小到大(去重并排序)
LinkedHashSet:使用链表维护元素的插入顺序
Set set = new HashSet<>();
可以直接取数
(缺点:取数困难,一般用新容器通过addAll()再存一遍,后取数,不知道当时怎么想的,也不知道看了哪里的资料)

Set常用方法有

set.add()//添加元素
set.remove(Object o)//删除一个对象的引用
set.clear()//清空容器
set.isEmpty()//判断容器是否为空
set.contains(Object o)//判断容器是否包含o(常用)
set.size()//返回容器中元素的数目

Map容器

Map接口实现类有
HashMap:用于快速访问,常用与哈希有关的(常用)
TreeMap:键处于排序状态
LinkedHashMap:保持元素插入的顺序

Map<String,Integer> map = new HashMap<>()Map常用方法有
map.putIfAbsent()//添加键值对,可以去重value
map.put()//添加键值对,直接覆盖
1.使用put方法添加键值对,如果map集合中没有该key对应的值,则直接添加,并返回null,如果已经存在对应的值,则会覆盖旧值,value为新的值。
2.使用putIfAbsent方法添加键值对,如果map集合中没有该key对应的值,则直接添加,并返回null,如果已经存在对应的值,则依旧为原来的值。
map.get()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值