#include "stdafx.h" #include <iostream> #include <fstream> #include <queue> #include <Windows.h> using namespace std; #define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 //顶点最多个数 #define LENGTH 5 //顶点字符长度 //邻接矩阵 typedef struct _Graph { int matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; char vexs[MAX_VERTEX_NUM][LENGTH]; int vexnum; int arcs; }Graph; int LocateVex(const Graph & g, char name[LENGTH]) { for (int i = 0; i < g.vexnum; i++) { if (0 == strcmp(g.vexs[i], name)) { return i; } } return -1; } //图的建造 void CreateGraph(Graph &g) { ifstream fcin(_T("graph.txt")); fcin>>g.vexnum; for (int i = 0; i < g.vexnum; i++) { for (int j = 0; j < g.vexnum; j++) { g.matrix[i][j] = INFINITY; } } for (int i = 0; i < g.vexnum; i++) { fcin>>g.vexs[i]; } fcin>>g.arcs; char arcHead[LENGTH]; char arcTail[LENGTH]; int weight; for (int i = 0; i < g.arcs; i++) { memset(arcHead, 0, LENGTH); memset(arcTail, 0, LENGTH); fcin>>arcTail>>arcHead>>weight; int x = LocateVex(g, arcHead); int y = LocateVex(g, arcTail); g.matrix[x][y] = weight; g.matrix[y][x] = weight; } } //v的第一个邻接点 int FirstAdjVex(const Graph &g, int v) { for (int i = 0; i < g.vexnum; i++) { if (g.matrix[v][i] != INFINITY) { return i; } } return -1; } //v相对于w的下一个邻接点 int NextAdjVex(const Graph &g, int v, int w) { for (int i = w + 1; i < g.vexnum; i++) { if (g.matrix[v][i] != INFINITY) { return i; } } return -1; } //邻接矩阵的输出 void PrintAdjVex(const Graph &g) { for (int i = 0; i < g.vexnum; i++) { for (int j = 0; j < g.vexnum; j++) { if (g.matrix[i][j] == INFINITY) { cout<<"*"<<'\t'; } else { cout<<g.matrix[i][j]<<'\t'; } } cout<<endl; } cout<<endl; } //深度优先遍历 bool visit[MAX_VERTEX_NUM]; void DFS (Graph& g, int v) { visit[v] = true; cout<<g.vexs[v]<<'\t'; for (int w = FirstAdjVex(g, v); w >= 0; w = NextAdjVex(g, v, w)) { if (!visit[w]) { DFS(g, w); } } } void DFSTraverse(Graph &g) { for (int v = 0; v < g.vexnum; v++) { visit[v] = false; } for (int v = 0; v < g.vexnum; v++) { if (!visit[v]) { DFS(g, v); } } cout<<endl; } //广度优先遍历 void BFSTraverse(Graph &g, char vName[LENGTH]) { int pos = LocateVex(g, vName); for (int v = 0; v < g.vexnum; v++) { visit[v] = false; } queue<int> q; if (!visit[pos]) { cout<<g.vexs[pos]<<'\t'; visit[pos] = true; } q.push(pos); while (!q.empty()) { int v = q.front(); q.pop(); for (int w = FirstAdjVex(g, v); w >= 0; w = NextAdjVex(g, v, w)) { if (!visit[w]) { cout<<g.vexs[w]<<'\t'; visit[w] = true; q.push(w); } } } cout<<endl; } //辅助函数,设置控制台的颜色 void SetConsoleTextColor(WORD dwColor) { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); if (INVALID_HANDLE_VALUE == handle) { return; } SetConsoleTextAttribute(handle, dwColor); } int _tmain(int argc, _TCHAR* argv[]) { Graph graph; CreateGraph(graph); SetConsoleTextColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); cout<<"************************邻接矩阵**************************"<<endl; PrintAdjVex(graph); SetConsoleTextColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); cout<<"**************************DFS****************************"<<endl<<endl; DFSTraverse(graph); SetConsoleTextColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY); cout<<"**************************BFS****************************"<<endl<<endl; BFSTraverse(graph, "V1"); return 0; }
运行界面如下:
建造图用到的graph.txt如下:
8 V1 V2 V3 V4 V5 V6 V7 V8 10 V1 V2 10 V1 V3 50 V2 V4 30 V3 V5 40 V3 V6 99 V4 V5 2 V4 V7 60 V5 V7 80 V6 V8 22 V7 V8 70