如上圖,我們可以把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");
}