两种储存方式优缺点比较
邻接矩阵的优点是可以快速判断两个顶点之间是否存在边,可以快速添加边或者删除边。而其缺点是如果顶点之间的边比较少,会比较浪费空间。因为是一个
n∗nn∗n 的矩阵。而邻接表的优点是节省空间,只存储实际存在的边。其缺点是关注顶点的度时,就可能需要遍历一个链表。还有一个缺点是,对于无向图,如果需要删除一条边,就需要在两个链表上查找并删除。
两种遍历方式
深度:
广度:
/**
* 图的广度优先遍历。
* 借助队列实现,同时设置一个包含结点个数的visited数组表示某个结点是否已经被遍历过。
* 初始化时把第一个结点加入到结果list中,并且把visited[0]设置为true。
* 循环开始时队列中存储的是图中的第一个结点,循环结束的条件是队列变成空。
* 循环体内取出队列的第一个元素,并且把这个元素的所有未被访问过的邻接点都加入到队列中、加入到结果list中、设置其对应的状态为已访问。
*/
public static boolean visited[];
public static ArrayList<Integer> list = new ArrayList<Integer>();
public static ArrayList<Integer> BFS_Graph(int graph[][]){
Queue<Integer> queue = new ArrayBlockingQueue<Integer>(10);
int size = graph.length;
visited = new boolean[size];
/*Step1:把初始第一个结点放到栈内。*/
queue.add(0);
visited[0] = true;
list.add(0);
int i ;
/*Step2:循环队列中的元素直到队列为空。*/
while(!queue.isEmpty()){
i = queue.poll();
for(int j =0;j<size;j++){//找刚刚被弹出队列的队头元素可达的点
if(graph[i][j] ==1 && visited[j] == false){
visited[j] = true;
list.add(j);
queue.add(j);
}
}
}
return list;
}
最短路径
Dijkstra算法
点击打开链接(代码)
拓扑排序