1. 程式人生 > >圖的基本操作(基於鄰接矩陣

圖的基本操作(基於鄰接矩陣

本文是資料結構(Java版)中國工信出版集團一書的讀書筆記

圖的插入操作包括插入頂點和插入邊

1.weight範圍:weight 在0到正無窮之間。若越界,則無邊,取值是正無窮

2.若I、j滿足:0≤I,j<圖的頂點數,I≠j,則設權值為weight,i、j越界,丟擲異常

3.i==j,自身環,丟擲無效引數異常

public void insertEdge(int i,int j,int weight){
	if(i != j){
		if(weight<=0 || weight >MAX_WEIGHT){
			weight = MAX_WEIGHT;
			this.matrix.set(i,j,weight);
		}
	}
	else throw new IllegalArgumentException("不能插入自身環");
}

插入頂點:

1.若插入元素x,其序號為I,i = n - 1;n為圖頂點數。若頂點順序表容量不足,順序表將自動擴充容量

2.在圖的鄰接矩陣中,初始化x所在行、列,主對角線元素值為0,其他元素值為正無窮。若鄰接矩陣容量不足,則擴充鄰接矩陣容量至2倍,再複製原矩陣元素。        

插入頂點的方法:

public int insertVertex(T x){
	int i = this.vertexlist.insert(x);//頂點順序表尾插入x,返回x序號,自動擴容
	if(i>= this.matrix.getRows()){
		this.matrix.setRowsColumns(i+1,j+1);
	}
	for(int j = 0;j<i;j++){//將新插入結點之前的所有結點與i結點建立聯絡
		this.matrix.set(i,j,MAX_WEIGHT);
		this.matrix.set(j,i,MAX_WEIGHT);
	}
	return i;
}

刪除一條邊的方法:

public void removeEdge(int i,int j){
	if(i != j){
		this.matrix.set(i,j,MAX_WEIGHT);
	}
}

public void removeEdge(Triple edge)
{
	this.removeEdge(edge.row,edge.column);//刪除一條邊,忽略權值
}


刪除頂點的方法:

1.刪除頂點順序表中第I個元素,即I+1~n-1元素向前移動,圖的頂點數-1.

2.刪除鄰接矩陣中與頂點i相關的所有邊,即將第I+1~n-1行元素全部向上移動一行。將第I+1~n-1列元素全部向左移動一列

public void removeVertex(int i){
	int n = this.vertexCount();
	if(i>=0 && i<n){
		this.vertexlist.remove(i);
		for(int j = i+1;j<n;j++){
			for(int k = 0;k<n;k++){
				this.matrix.set(j-1,k,this.matrix.get(j,k));
			}
		}
		for(int j = 0;j<n;j++){
			for(int k = i+1;k<n;k++){
				this.matrix.set(j,k-1,this.matrix.get(j,k));
			}
		}
		this.matrix.setRowsColumns(n-1,n-1);
	}
	else throw new IndexOutOfBoundsException("i="+i);
}