圖的鄰接矩陣存儲結構
阿新 • • 發佈:2017-08-08
data error 對角線 一個 () num out == using
如上圖。我們能夠把v0標記為0。v1標記為1。。
。。
並把聯通的2點權值全設置為1,那麽能夠用鄰接矩陣(右圖)來表示
概念解析:
第一個鄰接頂點:
我們以vo為例,第一個鄰接頂點為V1(事實上也能夠使V3,僅僅只是考慮計算機的存儲順序。我們找鄰接頂點,通常是從v0掃描到v3。所以我們先在內存中掃描到v1)
下一個鄰接頂點:
我們以v0為例,下一個鄰接頂點就是v3(相同,事實上也能夠使V1,僅僅只是考慮計算機的存儲順序,我們找下個鄰接頂點,通常是從v2掃描到v3。之所以從v2掃描起,那是由於,V1已經是第一個鄰接頂點了,那麽下一個鄰接頂點一定是在內存中存儲在V1後的數據了)
無向圖鄰接矩陣的特點:
對角線權值是0
無向圖矩陣關於斜線對稱(有向圖不正確稱)
代碼例如以下:
#include<iostream> using namespace std; #define VertexSize 10 typedef struct { int weight[VertexSize][VertexSize]; //表示2個頂點之間的權值 int edgenum; //表示圖的邊數目 }Graph; //初始化圖 void Initiate_Graph(Graph *g,int n) { int i,j; g->edgenum=0; for(i=0;i<n;i++) for(j=0;j<n;j++) { if(i==j) g->weight[i][j]=0; //對角線表示頂點自己到自己。權值為0 else g->weight[i][j]=0x7fff; //其它權值初始化為無限大 } } //插入邊 void InsertEdge(Graph *g,int v,int w,int weight,int n) { if(v<0 || v>=n||w<0||w>=n) { cout<<"overflow!"<<endl; } g->weight[v][w]=weight; g->edgenum++; } //取得點V的第一個臨接頂點 int GetFirstVertex(Graph *g,int v,int n) { if(v<0||v>=n) { cout<<"overflow"<<endl; return -1; } int i; for(i=0;i<n;i++) { if(( (g->weight[v][i])>0 )&&( (g->weight[v][i])<0x7fff) ) return i; } return -1; } //取得頂v的下一個鄰接頂點 int GetNextVertex(Graph *g,int v,int w,int n) { if(v<0||v>=n||w<0||w>=n) { cout<<"overflow"<<endl; return -1; } int i; for(i=w+1;i<n;i++) { if( ((g->weight[v][i])>0 )&& ((g->weight[v][i])<0x7fff )) return i; } return -1; } //刪除邊 void DeleteEdge(Graph *g,int v,int w,int n) { if(v<0||v>=n||w<0||w>=n||v==w) { cout<<"error"<<endl; } g->weight[v][w]=0x7fff; g->edgenum--; } void PrintGraph(Graph *g,int n) { int y,x,i; for(i=0;i<n;i++) { y=GetFirstVertex(g,i,n); if(y==-1) { cout<<"Vertex:"<<i<<"沒有第一個鄰接頂點"<<endl; } else { cout<<"Vertex:"<<i<<"第一個鄰接頂點"<<y<<endl; x=GetNextVertex(g,i,y,n); if(x!=-1) { cout<<"Vertex:"<<i<<"下一個鄰接頂點"<<x<<endl; } else { cout<<"Vertex:"<<i<<"沒有第二個鄰接頂點"<<endl; } } } } void main() { Graph g; int n,edge; cout<<"請輸入圖的頂點個數:"<<endl; cin>>n; cout<<"請輸入圖的邊個數"<<endl; cin>>edge; Initiate_Graph(&g,n); int i,p1,p2,weight; cout<<"請輸入頂點-頂點-權值:"<<endl; for(i=0;i<edge;i++) { cin>>p1>>p2>>weight; InsertEdge(&g,p1,p2,weight,n); } PrintGraph(&g,n); cout<<"輸入須要刪除的邊:"<<endl; int e1,e2; cin>>e1>>e2; DeleteEdge(&g,e1,e2,n); cout<<"刪除後邊的數目為:"<<g.edgenum<<endl; system("pause"); }
圖的鄰接矩陣存儲結構