#define MAXVEX 100 #define MINFINITE 0x7FFFFFFF #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:4996) typedef int EdgeType;

typedef struct
{
 int edgeBegin;
 int edgeEnd;
 int wight;
}EdgeWight;

typedef struct
{
 char data;
 int x;
 int y;
}Vertex;

typedef struct
{
 Vertex graphVertex[MAXVEX];
 EdgeType graphEdge[MAXVEX][MAXVEX];
 int vertexNum;
 int edgeNum;
}MGraph;

//初始化
void initGraph(MGraph* pGraph);
//生成图
void createGraph(MGraph* pGraph);
//展示图的邻接矩阵
void showGraph(MGraph pGraph);
//画图
void drawGraph(MGraph pGraph);
//DFS(深度优先搜索)
void DFSTraverse(MGraph pGraph);
//DFS
void DFS(MGraph pGraph, int* pVisited, int i);
//BFS(广度优先搜索)
void BFSTraverse(MGraph pGraph);



#include <stdio.h>
#include <wchar.h>
#include <graphics.h>
#include <conio.h>
#include <queue>
#include <malloc.h>
#include <algorithm>

using namespace std;
void initGraph1(MGraph* pGraph)
{
 //初始化边的矩阵
 for (int i = 0; i < pGraph->vertexNum; ++i)
 {
  for (int j = 0; j < pGraph->vertexNum; ++j)
  {
   if (i != j)
   {
    pGraph->graphEdge[i][j] = MINFINITE;
   }
   else
   {
    pGraph->graphEdge[i][j] = 0;
   }
  }
 }
}

void createGraph(MGraph* pGraph)
{
 FILE *fp(fopen("Graph.txt", "r"));
 fscanf(fp, "%d,%d\n", &pGraph->vertexNum, &pGraph->edgeNum);
 initGraph1(pGraph);
 for (int i = 0; i < pGraph->vertexNum; ++i)
 {
  fscanf(fp, "%c,%d,%d\n", &pGraph->graphVertex[i].data, &pGraph->graphVertex[i].x, &pGraph->graphVertex[i].y);
 }
 int i, j, wight;
 for (int k = 0; k < pGraph->edgeNum; ++k)
 {
  fscanf(fp, "%d,%d,%d\n", &i, &j, &wight);
  pGraph->graphEdge[i][j] = wight;
  pGraph->graphEdge[j][i] = wight;
  //printf("%d,%d,%d\n", i, j, wight);
 }
 fclose(fp);
}

void showGraph(MGraph pGraph)
{	 
printf("顶点数:%d,边数:%d\n顶点名称:", pGraph.vertexNum, pGraph.edgeNum);

for (int i = 0; i < pGraph.vertexNum; ++i) { printf("%c,", pGraph.graphVertex[i]); } puts("\n领接矩阵:"); for (int i = 0; i < pGraph.vertexNum; ++i) { for (int j = 0; j < pGraph.vertexNum; ++j) { if (pGraph.graphEdge[i][j] == MINFINITE) { printf("* "); } else { printf("%-3d", pGraph.graphEdge[i][j]); } } puts(""); } }

void drawGraph(MGraph pGraph)
{
 initgraph(640, 480,SHOWCONSOLE);

int x1, y1, x2, y2; setlinecolor(BLACK); setbkcolor(WHITE); cleardevice(); setbkmode(TRANSPARENT); wchar_t str[100]; for (int i = 1; i < pGraph.vertexNum; ++i) { for (int j = 0; j < i; ++j) { if (pGraph.graphEdge[i][j] > 0 && pGraph.graphEdge[i][j] < MINFINITE) { x1 = pGraph.graphVertex[i].x; y1 = pGraph.graphVertex[i].y; x2 = pGraph.graphVertex[j].x; y2 = pGraph.graphVertex[j].y; line(x1, y1, x2, y2); settextcolor(BLACK); swprintf(str,100,_T("%lc"), (wchar_t)pGraph.graphEdge[i][j]); outtextxy((x1 + x2 - 10) / 2, (y1 + y2 - 20) / 2, (LPCTSTR)str); } } } setfillcolor(YELLOW); int radio = 22; for (int i = 0; i < pGraph.vertexNum; ++i) { fillcircle(pGraph.graphVertex[i].x, pGraph.graphVertex[i].y, radio); outtextxy(pGraph.graphVertex[i].x - 5, pGraph.graphVertex[i].y - 5, pGraph.graphVertex[i].data); } DFSTraverse(pGraph); BFSTraverse(pGraph);

 _getch();
 closegraph();
}

/* DFS:它从图中某个顶点V出发,访问此顶点,然后从V的未被访问的邻接点出发深度优先便利图, 直至图中所有和V有路径相通的顶点都被访问到。 若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点, 重复上述过程,直至图中所有顶点都被访问到为止。 / void DFS(MGraph pGraph, int pVisited, int i) { pVisited[i] = 1; _getch(); setlinecolor(RGB(0,255,64)); setlinestyle(PS_SOLID, 3); circle(pGraph.graphVertex[i].x, pGraph.graphVertex[i].y, 25); printf("%c-->", pGraph.graphVertex[i]); int wight; for (int j = 0; j < pGraph.vertexNum; ++j) { //如果j没有被访问过,且i到j有通路 wight = pGraph.graphEdge[i][j]; if (pVisited[j] == 0 && (wight > 0 && wight < MINFINITE)) { DFS(pGraph, pVisited, j); } } }

void DFSTraverse(MGraph pGraph)
{
 puts("DFS深度优先遍历结果:");
 int visited[MAXVEX] = { 0 };
 for (int i = 0; i < pGraph.vertexNum; ++i)
 {
  if (visited[i] == 0)
  {
   DFS(pGraph, visited, i);
  }
 }
}

void BFSTraverse(MGraph pGraph)
{
 queue<int> queueTra;
 int visited[MAXVEX] = { 0 };
 int wight, k;
 for (int i = 0; i < pGraph.vertexNum; ++i)
 {
  if (visited[i] == 0)
  {

visited[i] = 1; queueTra.push(i); //如果队不为空 printf("BFS广度优先遍历结果:"); while (!queueTra.empty()) { _getch(); k = queueTra.front(); queueTra.pop(); setlinecolor(RGB(51,24,33)); setlinestyle(PS_SOLID, 3); circle(pGraph.graphVertex[k].x, pGraph.graphVertex[k].y, 25); printf("%c--->", pGraph.graphVertex[k].data); for (int j = 0; j < pGraph.vertexNum; ++j) { wight = pGraph.graphEdge[k][j]; if (visited[j] == 0 && (wight > 0 && wight < MINFINITE)) { queueTra.push(j); visited[j] = 1; } } } }

 }
}

//主函数
int main()
{
 MGraph graph;
 createGraph(&graph);
 showGraph(graph);
 drawGraph(graph);
 return 0;
C语言图的深度优先遍历和广度优先遍历算法实现

原文地址: https://www.cveoy.top/t/topic/o6bY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录