1. 程式人生 > >有向圖和無向圖鄰接矩陣的輸入輸出,深度深度優先搜尋,廣度優先搜尋

有向圖和無向圖鄰接矩陣的輸入輸出,深度深度優先搜尋,廣度優先搜尋

#include<iostream>
#include<stdlib.h>
#include<malloc.h>
#include<queue>
#define MAXLEN 100
using namespace std;
typedef char DataType;
bool visited[MAXLEN]; 
typedef struct{
	DataType vex[MAXLEN];     //頂點表 
	int arcs[MAXLEN][MAXLEN];    //鄰接矩陣,可以看作表 
	int NumVertexes,NumEdges;    //圖中當前的頂點數和邊數 
}Graph;
void CreateGraph(Graph *&G)
{
	G=(Graph*)malloc(sizeof(Graph));     //為結構體物件建立空間 
	int i,j,k;
	
	cout<<"圖的頂點數為:"<<endl;
	cin>>G->NumVertexes; 
	
	cout<<"圖的邊數為:"<<endl;
	cin>>G->NumEdges; 
	
	cout<<"輸入頂點資訊:"<<endl; 
	for(i=1;i<=G->NumVertexes;i++) 
	cin>>G->vex[i]; //讀入頂點資訊
	
	for(i=1;i<=G->NumVertexes;i++)
	for(j=1;j<=G->NumVertexes;j++) 
	G->arcs[i][j]=0;            //鄰接矩陣初始化
	
	/*for(i=1;i<=G->NumVertexes;i++)
	for(j=1;j<=G->NumVertexes;j++) 
	G->arcs[i][j]=-1;  */          //有權值的鄰接矩陣初始化
	
	for(k=1;k<=G->NumEdges;k++)                  //讀入e條邊   這時為無向圖 
	{
		cout<<"讀入邊:"<<endl; 
		cin>>i>>j;
		G->arcs[i][j]=1;
		G->arcs[j][i]=1;
		
	/*  cout<<"讀入邊和權值:"<<endl;   //當為有權值的圖時 
	    int w;
		cin>>i>>j>>w;
		G->arcs[i][j]=w;
		G->arcs[j][i]=w;	    
	*/	
	 } 
/*	 for(k=1;k<=G->NumEdge;k++)             //讀入e條邊   這時為有向圖 
	 {
	 cout<<"讀入邊:"<<endl; 
	 	cin>>i>>j;
	 	G->arcs[i][j]=1;
	 	
//	 cout<<"讀入邊和權值:"<<endl;   //當為有權值的圖時 
//	    int w;
//		cin>>i>>j>>w;
//		G->arcs[i][j]=w;	    
	
	 }*/ 
}
void PrintGraph(Graph *G)
{
	cout<<"圖的鄰接矩陣為:"<<endl; 
	for(int i=1;i<=G->NumVertexes;i++)
	{
		for(int j=1;j<=G->NumVertexes;j++)
		cout<<G->arcs[i][j]<<" ";
		cout<<endl;
	}
}
//深度優先遍歷(鄰接矩陣) 
void DFS(Graph *G,int i)    
{
	visited[i]=true;
	
	cout<<G->vex[i];
	
	for(int j=1;j<=G->NumVertexes;j++)
	if(G->arcs[i][j]==1&&!visited[j])
	DFS(G,j); 
}
//鄰接矩陣的深度優先遍歷操作 
void DFSTraverse(Graph *G)
{
	cout<<"鄰接矩陣的深度優先遍歷結果為:"<<endl;
	 
	for(int i=1;i<=G->NumVertexes;i++)
	visited[i]=false;      //初始化所有的頂點狀態都是未訪問的狀態
	
	for(int i=1;i<=G->NumVertexes;i++)
	if(!visited[i])        //對未訪問過的頂點呼叫DFS,若是連通圖,只會執行一次 
	DFS(G,i); 
	cout<<endl;
}
//鄰接矩陣的廣度優先遍歷 
void BFSTraverse(Graph *G)
{
	cout<<"鄰接矩陣的廣度優先遍歷結果為:"<<endl;
	
	queue<int> q;           //定義一個佇列q 
	
	for(int i=1;i<=G->NumVertexes;i++)      
	visited[i]=false;
	
	for(int i=1;i<=G->NumVertexes;i++)
	{
		if(!visited[i])
		{
			visited[i]=true;
			cout<<G->vex[i];
			q.push(i);
			while(!q.empty())
			{
				int t;
				t=q.front();
				q.pop();
				for(int j=1;j<=G->NumVertexes;j++)
				{
					if(G->arcs[t][j]==1&&!visited[j])
					{
						visited[j]=true;
						cout<<G->vex[j];
						q.push(j);
					}
				}
			}
		}
	 } 
	 cout<<endl;
 } 
int main()
{
	Graph *G;
	
	CreateGraph(G);
	PrintGraph(G);
	
	DFSTraverse(G);
	
	BFSTraverse(G);
 }