图的表示方法:

(1)邻接矩阵表示方法
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | |
| 0 | 0 | 1 | 2 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 |
| 2 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
| 3 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
| 4 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
| 5 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
| 6 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
(2)邻接表表示方法
| 0 | 1 | 2 | |
| 1 | 0 | 2 | 3 |
| 2 | 0 | 1 | 4 |
| 3 | 1 | 4 | |
| 4 | 2 | 3 | 5 |
| 5 | 4 | 6 | |
| 6 | 5 |
(3)边缘列表表示方法
| 0 | 0 | 1 |
| 1 | 0 | 2 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 3 | 4 |
| 5 | 2 | 4 |
| 6 | 4 | 5 |
| 7 | 5 |
6 |
ArrayList , LinkedList, List的区别:
List是一个接口,ArrayList, LinkedList分别是用两种不同的数据结构实现的两个类:
ArrayList是用数组实现的, LinkedList是用链表实现的。

在做实际项目的时候一般用List list = new ArrayList; 而不直接使用 ArrayList = new ArrayList;原因如下:
ArrayList是一个类,LIst是一个借口。ArrayList实现并继承了List。
List list = new ArrayList();这句创建了一个ArrayList对象以后上溯到了List。此时他是一个List对象了,有些ArrayList有但是List没有的属性和方法,他就不能在用了。
List有多个实现类,如LinkedList或者Vector等等,现在用的是ArrayList,也许哪一天就需要换成其他的实现类。这时就只需要改变这一行:List list = new ArrayList();就可以了。
其他使用list地方的代码根本不需要改动
题目描述:
现在你总共有 n 门课程需要修,记为 0 ~ n-1 。
在选修某些课程之前需要一些先修课程。例如,想要学习课程 0 ,你需要先完成课程 1, 我们用一个匹配来表示他们:【0,1】
给定课程总量以及他们的先决条件,判断是否可能完成所有课程的学习。
示例1:
输入:2,【【1,0】】
输出:true
解释:总共有2门课程,学习课程 1 之前需要先学习课程 0。
这是一道拓扑排序的题,挺简单的。直接上代码。
public boolean canFinish(int numCourses,int[][] prerequisites) {
if(numCourses<=0) {
return false;
}
int len=prerequisties.length();
if(len==0) {
return true;
}
int[] inDegree=new int[numCourses];
for(int[] p:prerequistes) {
inDegree[p[0]]++;
}
LinkedList<Integer> queue = new LinkedList<>();
for(int i=0;i<numCourses;i++) {
if(inDegree[i]==0) {
queue.addLast(i);
}
}
List<Integer> res = new ArrayList<>();
while(!queue.isEmpty()) {
Integer num = queue.removeFirst();
res.add(num);
for(int[] p:prerequisites) {
if(p[1]==num) {
inDegree[p[0]]--;
if(inDegree[p[0]]==0) {
queue.addLast(p[0]);
}
}
}
}
return numCourses == res.length();
}