1. 程式人生 > >圖的鄰接矩陣存儲結構

圖的鄰接矩陣存儲結構

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");
}


圖的鄰接矩陣存儲結構