C++邻接表图操作

18 阅读1分钟

2017-03-17 10:53:04

#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <sstream>
#include <functional>
#include<iomanip>
using namespace std;
typedef struct{
	vector<vector<int>> arcs;//邻接矩阵
	vector<char> vexs;//顶点表
	int vexnum, edgenum;//顶点数和边数
	vector<bool> visited;

}Graph;
int locates(Graph *g, char ch)
{
	int i = 0;
	for (i = 0; i < g->vexnum; i++)
	{
		if (g->vexs[i] == ch)
		{
			break;
		}
	}
	if (i >= g->vexnum)
	{
		return -1;
	}

	return i;
}
void CreateGraph(Graph &G)
{
	
    cout<<"创建邻接矩阵的无向图:"<<endl;  
    int i,j,k,w;  
    //G5的存储:  
	G.vexnum = 8;
	G.edgenum = 9;
	G.visited=vector<bool>(G.vexnum, false);
	for (i = 0; i < G.vexnum; ++i){
		vector<int> a;
		for (j = 0; j < G.vexnum; ++j) {
			a.push_back(0);
		}
		G.arcs.push_back(a);
	}
    G.vexs.push_back('1');  
	G.vexs.push_back('2');
	G.vexs.push_back('3');
	G.vexs.push_back('4');
	G.vexs.push_back('5');
	G.vexs.push_back('6');
	G.vexs.push_back('7');
	G.vexs.push_back('8');
  
    G.arcs[0][1] = 1;  
    G.arcs[1][0] = 1;  
   
  
    G.arcs[1][3] = 1;  
    G.arcs[3][1] = 1;  
  
    G.arcs[3][7] = 1;  
    G.arcs[7][3] = 1;  
 
  
    G.arcs[7][4] = 1;  
    G.arcs[4][7] = 1;  
  
    G.arcs[4][1] = 1;  
    G.arcs[1][4] = 1;  
  
    G.arcs[0][2] = 1;  
    G.arcs[2][0] = 1;  

  
    G.arcs[2][5] = 1;  
    G.arcs[5][2] = 1;  
  
    G.arcs[5][6] = 1;  
    G.arcs[6][5] = 1;  
  
    G.arcs[6][2] = 1;  
    G.arcs[2][6] = 1;  


}

void DFS(Graph &g, int i){
	
	cout << g.vexs[i]<<" ";
	g.visited[i] = true;
	for (int j = 0; j < g.vexnum; j++){
		if (g.arcs[i][j] == 1 && !g.visited[j]){
			DFS(g, j);
		}
	}

}
void DFSTraverse(Graph &g){//  

	for (int i = 0; i < g.vexnum; i++)
		g.visited[i] = false;
	for (int i = 0; i < g.vexnum; i++)
		if (!g.visited[i]) DFS(g, i); //v未访问过,从vi开始DFS搜索  


}
void BFSTraverse(Graph &g){
	for (int i = 0; i < g.vexnum; i++)
		g.visited[i] = false;
	queue<int> q;
	for (int i = 0; i < g.vexnum; i++){
		if (!g.visited[i]){
			g.visited[i] = true;
			cout << g.vexs[i] << " ";
			q.push(i);
			while (!q.empty()){
				int m = q.front();
				q.pop();
				for (int j = 0; j < g.vexnum; j++){
					if (g.arcs[m][j] == 1 && !g.visited[j]){
						g.visited[j] = true;
						cout << g.vexs[j] << " ";
						q.push(j);
					}
				}
			}
		}
	}
}
//打印图
void printGraph(Graph g)
{
	int i, j;
	for (i = 0; i < g.vexnum; i++)
	{
		for (j = 0; j < g.vexnum; j++)
		{
			printf("%d  ", g.arcs[i][j]);
		}
		printf("\n");
	}
}
int main(){
	Graph g;

	//邻接矩阵创建图
	CreateGraph(g);
	printGraph(g);
	BFSTraverse(g);
	DFSTraverse(g);
	return 0;
	

}