1. 程式人生 > >C++鄰接矩陣建立圖及深度、廣度遍歷

C++鄰接矩陣建立圖及深度、廣度遍歷

#include "stdafx.h"
#include<iostream>
#include<queue>
using namespace std;
#define VERTEX_MAX 26   //圖的最大頂點數   
#define MAXVALUE 32767 //最大值(可設為一個最大整數) 
typedef struct //定義鄰接矩陣圖結構 
{
	char Vertex[VERTEX_MAX]; //儲存頂點資訊(序號或字母)
	int Edges[VERTEX_MAX][VERTEX_MAX]; //儲存邊的權 
	int isTrav[VERTEX_MAX]; //遍歷標誌 
	int VertexNum; //頂點數量 
	int EdgeNum;//邊數量 
	int GraphType; //圖的型別(0:無向圖,1:有向圖)    
}MatrixGraph;

void CreateMatrixGraph(MatrixGraph *G)//建立鄰接矩陣圖 
{
	int i, j, k, weight;
	char start, end; //邊的起始頂點
	for (i = 0; i < G->VertexNum; i++)  //清空矩陣
	{
		for (j = 0; j < G->VertexNum; j++)
			G->Edges[i][j] = MAXVALUE; //設定矩陣中各元素的值為最大值
	}
	cout << "輸入各頂點資訊\n";
	for (i = 0; i<G->VertexNum; i++) //輸入頂點 
	{
		printf("第%d個頂點:", i + 1);
		cin >> G->Vertex[i] ; //儲存到各頂點陣列元素中
	}
	printf("輸入構成各邊的兩個頂點及權值:\n");
	for (k = 0; k<G->EdgeNum; k++)  //輸入邊的資訊 
	{
		printf("第%d條邊:", k + 1);
		cin >> start >> end >> weight;
		for (i = 0; start != G->Vertex[i]; i++); //在已有頂點中查詢始點 
		{
			for (j = 0; end != G->Vertex[j]; j++); //在已有頂點中查詢結終點
			{
				G->Edges[i][j] = weight; //對應位置儲存權值,表示有一條邊
				if (G->GraphType == 0)  //若是無向圖
				{
					G->Edges[j][i] = weight;//在對角位置儲存權值
				}
			}
		}
	}
}

void OutMatrix(MatrixGraph *G)//輸出鄰接矩陣 
{
	int i, j;
	for (j = 0; j<G->VertexNum; j++)
		printf("\t%c", G->Vertex[j]);          //在第1行輸出頂點資訊 
	printf("\n");
	for (i = 0; i<G->VertexNum; i++)
	{
		printf("%c", G->Vertex[i]);
		for (j = 0; j<G->VertexNum; j++)
		{
			if (G->Edges[i][j] == MAXVALUE) //若權值為最大值 
				printf("\t∞");          //輸出無窮大符號 
			else
				printf("\t%d", G->Edges[i][j]); //輸出邊的權值 
		}
		printf("\n");
	}
}

void BFSfunction(MatrixGraph *G, int i)//廣度優先遍歷
{
	int  j ;
	queue<int> Q;
	G->isTrav[i] = 1 ;//表示這個頂點已經被遍歷過了
	cout <<"->"<< G->Vertex[i] ;//輸出第一個頂點
	Q.push(i);	//入佇列
	while (!Q.empty()) 
	{
		Q.pop();
		for (j = 0; j < G->VertexNum; j++)
		{
			if (G->Edges[i][j] != MAXVALUE && !G->isTrav[j])
			{
				cout << "->" << G->Vertex[j];
				G->isTrav[j] = 1;
				Q.push(j);
			}
		}
	}
}
void BFSTraverse(MatrixGraph *G)//廣度優先
{
	int i;
	for (i = 0; i < G->VertexNum; i++)	//表示其它頂點為被遍歷
		G->isTrav[i] = 0;
	for (i = 0; i < G->VertexNum; i++)
	{
		if (!G->isTrav[i])	//若未被遍歷
			BFSfunction(G, i);//遍歷一下
	}
}
void DFSfunction(MatrixGraph *G, int i)//深度遍歷函式
{
	int j = 0;
	G->isTrav[i] = 1;//標記該頂點已經被遍歷過
	cout << "->" << G->Vertex[i];//輸出第一個遍歷的頂點資訊
	for (j = 0; j < G->VertexNum; j++)//迴圈遍歷其它頂點
	{
		if (G->Edges[i][j] != MAXVALUE && !G->isTrav[i])//該結點有相連的其它頂點且未被遍歷且
		{
			DFSfunction(G, j);
		}
	}
}
void DFSTraverse(MatrixGraph *G)//深度優先遍歷
{
	int i;
	for (i = 0; i < G->VertexNum; i++)//表示各頂點還沒有被遍歷
	{
		G->isTrav[i] = 0;
	}
	for (i = 0; i < G->VertexNum; i++)
	{
		if (!G->isTrav[i])//若未被遍歷
			DFSfunction(G, i);//遍歷一下
	}
	cout << '\n';
}

int _tmain(int argc, _TCHAR* argv[])
{
	MatrixGraph G; //定義儲存鄰接矩陣結構的圖 
	int i, j;
	cout << "輸入生成圖的型別(0:無向圖,1:有向圖):\n";
	cin >> G.GraphType;//圖的種類
	cout << "輸入圖的頂點數量和邊數量:\n";
	cin >> G.VertexNum >> G.EdgeNum;//輸入圖頂點數和邊數 

	CreateMatrixGraph(&G); //建立用鄰接表儲存的圖 
	printf("鄰接矩陣資料如下:\n");
	OutMatrix(&G);
	cout << "深度優先遍歷結點:";
	DFSTraverse(&G);
	cout << "廣度優先遍歷結點:";
	BFSTraverse(&G);
	cout << endl;
	system("pause");
	return 0;
}

IDE是vs2013.