邻接矩阵
public interface Graph<V> {
int numOfVertex();//返回顶点的个数
int numOfEdge();//返回边的个数
void addVertex(V v);//增加一个顶点
void addEdge(V from, V to);//增加一条边
void addEdge(V from, V to, int weight);//增加一条带权值的边
void removeVertex(V v);//删除一个顶点
void removeEdge(V from, V to);//删除一条边
void displayGraph();//显示一个图
int degree(V v);//返回顶点v的度
}
//无向图的邻接矩阵存储
public class UndirectedMatrixGraph<V> implements Graph<V> {
private ArrayList<V> vertexList;//存储顶点的集合
private int[][] edgeMatrix;//存储边的邻接矩阵
private int numOfVertex;//顶点的个数
private int numOfEdge;//边的个数
private int size;//顶点的最大规模
private boolean[] isVisited;//记录顶点是否被访问
public UndirectedMatrixGraph() {
}
public UndirectedMatrixGraph(int size) {
this.size = size;
vertexList = new ArrayList<V>(size);
edgeMatrix = new int[size][size];
numOfVertex = 0;
numOfEdge = 0;
isVisited = new boolean[numOfVertex];
}
@Override
public int numOfVertex() {
return this.numOfVertex;
}
@Override
public int numOfEdge() {
return this.numOfEdge;
}
@Override
public void addVertex(V v) {
this.vertexList.add(v);
numOfVertex++;
}
@Override
public void addEdge(V from, V to) {
addEdge(from, to, 1);
}
@Override
public void addEdge(V from, V to, int weight) {
int i = vertexList.indexOf(from);
int j = vertexList.indexOf(to);
edgeMatrix[i][j] = weight;
edgeMatrix[j][i] = weight;
numOfEdge++;
}
@Override
public void removeVertex(V v) {
int index = vertexList.indexOf(v);//找到顶点的索引
//所有的行向前移动一行
for (int i = index; i < numOfVertex - 1; i++) {//拿到index这一行,和后面的每一行
for (int j = 0; j < numOfVertex; j++) {//遍历某一行的所有元素
edgeMatrix[i][j] = edgeMatrix[i + 1][j];//把每个元素上移
}
}
//所有的列向前移动一行
for (int i = 0; i < numOfVertex; i++) {
for (int j = index; j < numOfVertex - 1; j++) {
edgeMatrix[i][j] = edgeMatrix[i][j + 1];
}
}
vertexList.remove(index);//从顶点的集合中删除这个顶点
numOfVertex--;//顶点的个数-1
//遍历邻接矩阵,得到依赖该顶点的边的条数从而调整边的总数
for (int i = 0; i < numOfVertex; i++) {
if (edgeMatrix[index][i] != 0) {
numOfEdge--;
}
}
}
@Override
public void removeEdge(V from, V to) {
int i = vertexList.indexOf(from);
int j = vertexList.indexOf(to);
edgeMatrix[i][j] = 0;
edgeMatrix[j][i] = 0;
numOfEdge--;
}
@Override
public void displayGraph() {
System.out.println("这是一个无向图(邻接矩阵)");
System.out.println("这个图的顶点是:" + vertexList);
System.out.println("这个图的邻接矩阵是:");
for (int i = 0; i < numOfVertex; i++) {
for (int j = 0; j < numOfVertex; j++) {
System.out.print(edgeMatrix[i][j] + "\t");
}
System.out.println();
}
}
@Override
public int degree(V v) {
int n = 0;
int index = vertexList.indexOf(v);
for (int i = 0; i < numOfVertex; i++) {
if (edgeMatrix[index][i] != 0) {
n++;
}
}
return n;
}
}
public class GraphDemo {
public static void main(String[] args) {
Graph graph = new UndirectedMatrixGraph<Character>(6);
//添加顶点
graph.addVertex('A');
graph.addVertex('B');
graph.addVertex('C');
graph.addVertex('D');
graph.addVertex('E');
graph.addVertex('F');
//添加边
graph.addEdge('A', 'B');
graph.addEdge('A', 'D');
graph.addEdge('B', 'C');
graph.addEdge('B', 'E');
graph.addEdge('C', 'D');
graph.addEdge('C', 'F');
graph.addEdge('D', 'F');
graph.addEdge('E', 'F');
graph.displayGraph();
System.out.println("图的顶点数为" + graph.numOfVertex());
System.out.println("图的边数为" + graph.numOfEdge());
//删除顶点
graph.removeVertex('B');
graph.displayGraph();
System.out.println("图的顶点数为" + graph.numOfVertex());
System.out.println("图的边数为" + graph.numOfEdge());
System.out.println("节点C的度为" + graph.degree('C'));
}
}
邻接表
public interface Graph<V> {
int numOfVertex();//返回顶点的个数
int numOfEdge();//返回边的个数
void addVertex(V v);//增加一个顶点
void addEdge(V from, V to);//增加一条边
void addEdge(V from, V to, int weight);//增加一条带权值的边
void removeVertex(V v);//删除一个顶点
void removeEdge(V from, V to);//删除一条边
void displayGraph();//显示一个图
int degree(V v);//返回顶点v的度
}
//无向图的邻接表存储
public class UndirectedLinkGraph<V> implements Graph<V> {
class Vertex<V> {//内部类,存储顶点的信息
V date;//顶点值
LinkedList<Integer> adj;//顶点的每一个邻接顶点构成的邻接表,Integer为顶点在顶点数组中的下标
//顶点的构造方法
Vertex(V date) {
this.date = date;
adj = new LinkedList<Integer>();
}
public V getDate() {
return date;
}
public LinkedList<Integer> getAdj() {
return adj;
}
}
Vertex<V>[] vertexList;//由顶点组成的数组
int numOfVertex;//顶点的数量
int numOfEdge;//边的数量
int size;//顶点的最大规模
UndirectedLinkGraph() {
}
UndirectedLinkGraph(int size) {
vertexList = new Vertex[size];
numOfVertex = 0;
numOfEdge = 0;
}
@Override
public int numOfVertex() {
return numOfVertex;
}
@Override
public int numOfEdge() {
return numOfEdge;
}
@Override
public void addVertex(V v) {
vertexList[numOfVertex] = new Vertex<V>(v);
numOfVertex++;
}
@Override
public void addEdge(V from, V to) {
addEdge(from, to, 1);
}
@Override
public void addEdge(V from, V to, int weight) {
//传入的是一个Vertex对象的顶点值
//根据顶点值找这个Vertex对象在数组中的索引
int i = getIndex(from);
int j = getIndex(to);
vertexList[i].adj.add(j);
vertexList[j].adj.add(i);
numOfEdge++;
}
//根据顶点值找这个Vertex对象在数组中的索引
public int getIndex(V v) {
for (int i = 0; i < numOfVertex(); i++) {
if (vertexList[i].date == v) {
return i;
}
}
return -1;
}
@Override
public void removeVertex(V v) {
int index = getIndex(v);
//更新边的总数
numOfEdge = numOfEdge - degree(v);
//更新顶点的个数
numOfVertex--;
//删除边
for (int i : vertexList[index].adj) {//遍历删除的这个顶点的邻接表,获取每邻接顶点一个值
vertexList[i].adj.remove(new Integer(index));//删除邻接顶点的邻接表中被删除顶点的值
}
//删除这个顶点
for (int i = index; i < numOfVertex - 1; i++) {
vertexList[i] = vertexList[i + 1];
}
//更新邻接表中存储的被删除顶点后面的顶点的下标
for (int i = 0; i < numOfVertex; i++) {
for (int j = 0; j < vertexList[i].adj.size(); j++) {
LinkedList<Integer> list = vertexList[i].adj;
if (list.get(j) > index) {
list.set(j, list.get(j) - 1);
}
}
}
}
@Override
public void removeEdge(V from, V to) {
int i = getIndex(from);
int j = getIndex(to);
vertexList[i].adj.remove(new Integer(j));
vertexList[j].adj.remove(new Integer(i));
numOfEdge--;
}
@Override
public void displayGraph() {
System.out.println("这是一个邻接表存储的无向图");
for (int i = 0; i < numOfVertex; i++) {
System.out.print("顶点:" + vertexList[i].date + "\t");
System.out.println("邻接表:" + vertexList[i].adj);
}
}
@Override
public int degree(V v) {
int i = getIndex(v);
return vertexList[i].adj.size();
}
}
public class GraphDemo {
public static void main(String[] args) {
Graph graph = new UndirectedLinkGraph<Character>(6);//邻接表测试
//添加顶点
graph.addVertex('A');
graph.addVertex('B');
graph.addVertex('C');
graph.addVertex('D');
graph.addVertex('E');
graph.addVertex('F');
//添加边
graph.addEdge('A', 'B');
graph.addEdge('A', 'D');
graph.addEdge('B', 'C');
graph.addEdge('B', 'E');
graph.addEdge('C', 'D');
graph.addEdge('C', 'F');
graph.addEdge('D', 'F');
graph.addEdge('E', 'F');
graph.displayGraph();
System.out.println("图的顶点数为" + graph.numOfVertex());
System.out.println("图的边数为" + graph.numOfEdge());
//删除顶点
graph.removeVertex('B');
graph.displayGraph();
System.out.println("图的顶点数为" + graph.numOfVertex());
System.out.println("图的边数为" + graph.numOfEdge());
System.out.println("顶点C的度为" + graph.degree('C'));
}
}