1. 程式人生 > >資料結構BFS與DFS的實現(鄰接矩陣)

資料結構BFS與DFS的實現(鄰接矩陣)

#include<bits/stdc++.h>
#define MaxInt 2e9
#define MVNum 100
#define OK 1
#define ERROR 0
using namespace std;
typedef char VerTexType;
typedef int Status;
typedef int ArcType;
bool visit[MVNum];

typedef struct
{
	VerTexType vex[MVNum];
	ArcType arcs[MVNum][MVNum];
	int vexnum,arcnum;
}AMGraph;

int LocateVex(AMGraph &G,char &v)
{
	int i;
	for (i=0;i<G.vexnum;i++)
	{
		if (G.vex[i]==v)
			return i;
	}
	if (i>=G.vexnum) return ERROR;
	else return 0;
}

Status CreateUDN(AMGraph &G)
{
	int i,j,k;
	char v1,v2;
	printf("輸入圖的頂點數:");
	scanf("%d",&G.vexnum);
	printf("輸入邊的條數:");
	scanf("%d",&G.arcnum);
	printf("輸入各個點的資訊:\n");
	for (i=0;i<G.vexnum;i++)
		cin>>G.vex[i];
	for (i=0;i<G.vexnum;i++)
		for (j=0;j<G.vexnum;j++)
			G.arcs[i][j] = 0;
	printf("\n輸入由兩個頂點構成的邊:\n");
	for (k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2;
		i = LocateVex(G,v1);
		j = LocateVex(G,v2);
		G.arcs[i][j] = 1;
		G.arcs[j][i] = 1;
	}
	printf("\n圖建立成功!\n");
	return OK;
}
void dfs(AMGraph G, int i)
{
	int j,k;
	stack<int> s;
	s.push(i);
	printf("%c ",G.vex[i]);
	visit[i] = 1;
	while(!s.empty())
	{
		i = s.top();
		for(j=0;j<G.vexnum;j++)
		{
			if(G.arcs[i][j]!=0 && !visit[j])
			{
				s.push(j);
				printf("%c ",G.vex[j]);
				visit[j] = 1;
				i = j;
				j = 0;
			}
		}
		
		if(!s.empty())
		s.pop();
	}
}
void DFS(AMGraph G,int k)
{
	visit[k] = 1;
	printf("%c ",G.vex[k]);
	for (int w=0;w<G.vexnum;w++)
		if (G.arcs[k][w]!=0 && !visit[w])
			DFS(G,w);
}

void DFSTravel(AMGraph G)
{
	printf("\nDFS遞迴遍歷:\n");
	memset(visit,0,sizeof(visit));
	for (int i=0;i<G.vexnum;i++)
		if (!visit[i]) 
			DFS(G,i);
	printf("\n");
	printf("\nDFS非遞迴遍歷:\n"); 
	memset(visit,0,sizeof(visit));
	for (int i=0;i<G.vexnum;i++)
		if (!visit[i]) 
			dfs(G,i);
	printf("\n");
}

void BFS(AMGraph G,int k)
{
	queue<int> q;
	memset(visit,0,sizeof(visit));
	if (!visit[k])
	{
		visit[k] = 1;
		printf("%c ",G.vex[k]);
		q.push(k);
	}
	while (!q.empty())
	{
		int t = q.front();
		q.pop();
		for (int w=0;w<G.vexnum;w++)
		{
			if (G.arcs[t][w]!=0 && !visit[w])
			{
				visit[w] = 1;
				printf("%c ",G.vex[w]);
				q.push(w);
			}
		}
	}
} 

void BFSTravel(AMGraph G)
{
	printf("\nBFS遍歷:\n");
	memset(visit,0,sizeof(visit));
	for (int i=0;i<G.vexnum;i++)
		if (!visit[i])
			BFS(G,i);
	printf("\n");
}

int main()
{
	AMGraph G;
	CreateUDN(G);
	DFSTravel(G);
	BFSTravel(G);
	return 0;
}