问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

图的遍历

发布网友 发布时间:2022-04-24 15:10

我来回答

1个回答

热心网友 时间:2022-04-26 19:51

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;

//Graph.h
/*typedef double AdjMatrix[MaxN][MaxN]; //赋权图
typedef struct //邻接矩阵表示的图的数据类型
{ int Vnum; //图中顶点数
AdjMatrix Arcs;
}Graph_M; */
typedef struct AcrNode //邻接表的表结点
{ int adjvex; //邻接表的顶点序号
double weight; //边(弧)上的权值
struct AcrNode * nextarc; //下一个邻接顶点
}EdgeNode;
typedef struct VNode //邻接表的头结点
{
char data; //顶点表示的数据, 以一个字符表示
EdgeNode * firstarc; //指向第一条依附于该顶点的弧的指针
}AdjList;
typedef struct //邻接链表表示的图的数据类型
{ int Vnum;
AdjList *Vertices;
}Graph_A;

Graph_A * CreatGraph_A();
void SaveGraph_A(Graph_A * graph);
void Dfs(Graph_A G, int i);
void Search(Graph_A * G, int start, int end, int &p, double len);
void Display();
extern int MaxN;
extern int * L;
extern int * T;
extern double len_T, len_L;

int main()
{
Graph_A * graph;
int choice;
char str[20];
while(1)
{
do{
cout << endl << endl;
cout << "/*/*/*/*/*/*/*/*/*/*/*/*" << endl;
cout << "1.创建新图" << endl;
cout << "2.退出" << endl;
cout << "/*/*/*/*/*/*/*/*/*/*/*/*" << endl;
cout << "按数字键选择对应操作: ";
cin >> str;
choice = atoi(str);
cout << endl;
switch(choice)
{
case 1:
graph = CreatGraph_A();
case 2:
return 0;
default:
choice = 0;
cout << "输入错误" << endl;
}
}while(!choice);

cout << endl << endl;
cout << "开始寻找最短路径(输入0,0退出)......" << endl << endl;
while(1)
{
int start, end;
for(start=1;start<=MaxN;start++)
for(end=1;end<=MaxN;end++)
Search(graph, start, end, p, 0.0);
Display();
}//while
}//while
return 0;
}

int MaxN = 100;

/*
* 函数功能: 建立邻接链表表示的图
* 输入参数: NULL
* 输出参数: Graph_A 邻接链表表示的图*/
Graph_A * CreatGraph_A()
{ //顶点数
cout << "输入顶点数: ";
cin >> MaxN;
Graph_A * graph = (Graph_A *)malloc(sizeof(Graph_A));
EdgeNode temp;
EdgeNode * tp;
graph->Vertices = (AdjList *)malloc(MaxN * sizeof(AdjList));
graph->Vnum = MaxN;
for(int i=0; i<MaxN; i++)
{ graph->Vertices[i].data = i+1;
graph->Vertices[i].firstarc = NULL;
cout << "输入与第" << i+1 << "个结点相连的结点信息(结点编号为0表示结束):" << endl;
while(1)
{ cout << "输入结点编号: ";
cin >> temp.adjvex;
if(!temp.adjvex)
{
break;
}
cout << "输入路径长度: ";
cin >> temp.weight;
/*double t;
cout << "选择倍率: ";
cin >> t;
temp.weight *= t;*/
tp = (EdgeNode *)malloc(sizeof(EdgeNode));
*tp = temp;
tp->nextarc = graph->Vertices[i].firstarc;
graph->Vertices[i].firstarc = tp;
}
}
return graph;
}

void SaveGraph_A(Graph_A * graph)
{
FILE * fp;
EdgeNode * tp;
char g_name[50];
cout << "输入保存图的文件名: ";
cin >> g_name;
if(!(fp = fopen(g_name, "w")))
{
return;
}
fwrite(&(graph->Vnum), sizeof(int), 1, fp);
fputc('\n', fp);
for(int i=0; i<MaxN; i++)
{
fwrite(&(graph->Vertices[i].data), sizeof(char), 1, fp);
fputc('\n', fp);

tp = graph->Vertices[i].firstarc;
while(tp)
{
fwrite(tp, sizeof(EdgeNode), 1, fp);
//fwrite(&(tp->adjvex), sizeof(int), 1, fp);
//fwrite(&(tp->weight), sizeof(double), 1, fp);
fputc('c', fp);
tp = tp->nextarc;
}
tp = (EdgeNode *)malloc(sizeof(EdgeNode));
tp->adjvex = 0;
tp->nextarc = NULL;
tp->weight = 0;
fwrite(tp, sizeof(EdgeNode), 1, fp);
fputc('\n', fp);
}
fclose(fp);
}

int * visited = (int *)malloc(MaxN * sizeof(int));
/*
* 函数功能: 深度优先遍历邻接链表表示的图
* 输入参数: Graph_A G 邻接链表表示的图
int i 出发结点
* 输出参数: void
*/
void Dfs(Graph_A G, int i)
{
EdgeNode * t;
int j;
printf("%d", i+1); //访问序号为i的顶点
visited[i] = 1; //序号为i的结点已经访问过
t = G.Vertices[i].firstarc;
//取顶点i的第一个邻接的顶点

while(t) //检查所有与顶点i相邻接的顶点
{
j = t->adjvex; //顶点j为顶点i的一个邻接顶点
if(!visited[j]) //若j从未被访问过
{
Dfs(G, j); //从顶点j出发进行深度优先遍历
}
t = t->nextarc; //取顶点i的下一个邻接顶点
}
}

/*
* 函数功能: 寻找两点间最短路径
* 输入参数: Graph_A G 邻接链表表示的图
int start 出发结点
int end 目的结点
int p 当前位置
double len 进入函数前len_T增加的量
* 输出参数: void
*/
int * L = (int *)malloc((MaxN+1) * sizeof(int));
int * T = (int *)malloc((MaxN+1) * sizeof(int));
double len_T, len_L;
void Search(Graph_A * G, int start, int end, int &p, double len)
{
if(start == end || len_T >= len_L)
{
if(len_T < len_L)
{
len_L = len_T;
for(int i=0; i<p; i++)
{
L[i] = T[i];
}
L[p] = 0;
}
len_T -= len;
p--;
return;
}

EdgeNode * tp = (EdgeNode *)malloc(sizeof(EdgeNode));
tp = G->Vertices[start-1].firstarc;

while(tp)
{
int b = 1;
for(int i=0; i<p; i++)
{
if(T[i] == tp->adjvex)
{
b = 0;
break;
}
}
if(b)
{
len_T += tp->weight;
T[p++] = tp->adjvex;
Search(G, tp->adjvex, end, p, tp->weight);
}
tp = tp->nextarc;
}

p--;
len_T -= len;
return;
}

void Display()
{
cout << "路径: ";
for(int i=0; L[i]; i++)
{
cout << L[i] << " ";
}
cout << endl << "长度: " << len_L << endl << endl;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
导购什么字 店面导购员是什么意思 HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayer\SafeVersions... 无法安装adobeflashplayer,说无法注册ACTIVEX的控件 无法注册flash player的activex怎么办 omniverse create 他总说无法注册Flash player的Active控件 然后什么访问以下链接。不要... excel如何用进度条的形式表示完成率 买了件速干衣,北面的,求大神看一下真假。 秦皇岛银谷全城热恋是不是要预定票啊 ipguard这款产品如何? 图形推理遍历是什么意思? 有没有人用过IP—guard 练字从什么字体练起 最基础的 图遍历的定义 适合中小型企业的防泄密系统,实现数据安全 图遍历的分类 练字的步骤 使用图的遍历方法判断一个图是否连通,其判断依据是 想练字,但不知从哪开始 草书,正楷,行书,行草,行楷,练字顺序。 练习书法,应该如何入门 初学书法 该选择什么字体来练习 初学者练字练什么字体比较好 我练字,想练草书,各位觉得草书好不好看 初学者练字,如何正确练习,怎么练? 骁龙865能否成为几年后的钉子户?为什么呢? 练字草书怎么写 怎么练习钢笔书法 没有任何练字基础想直接练习草书可以吗 从哪入门 重制版扶摇升级点都在哪 ip-guard 是不是商用密码产品 C语言 图的遍历 ip-guard ,虹安,华途,中软放水坝这些内控加密软件哪个好 面试问题:请问图有哪几种遍历方式?什么是深度优先?什么是广度优先? 现在四大银行理财产品的利率都是一样吗?假如投资100万,四大银行利率又是多少呢? 有什么企业用的加密软件推荐? IP-Guard是什么软件? 图的遍历问题 装IP-guard的电脑上如果装了双系统还有用么? 使用图遍历的方法判断一个图是否连通,其判断依据是? 图及其与应用——图的遍历 图的遍历操作 为什么都说ip-guard破坏图纸文件呢? 衣服上沾上猪血怎么样能够洗干净? 猪血要焯水吗 绿盾加密软件功能怎么样?和稳定性方面? 我想问一下 图的遍历两种方法DFS和BFS作用域有向图和无向图有什么区别,例如如果是同一个结构的图就是上面 自建呼叫中心vs外包呼叫中心,哪个更好 猪血怎么去腥味 ip guard3普通模块和加密模块有什么区别