图的表示方法:

(1)邻接矩阵表示方法

 0123456
00120000
11011000
21100100
30100100
40011010
50000101
60000010

(2)邻接表表示方法

012 
1023
2014
314 
4235
546 
65  

(3)边缘列表表示方法

001
102
212
313
434
524
645
75

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();
    }
02-13 13:26