圖的基本操作(基於鄰接矩陣
阿新 • • 發佈:2019-02-11
本文是資料結構(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);
}