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

c语言邻接矩阵建造一个无向图并深度优先遍历 请问我写的程序为啥只能输出部分节点。。高手帮帮忙

发布网友 发布时间:2022-05-13 18:25

我来回答

3个回答

热心网友 时间:2023-10-20 12:43

你的DFS函数,就是深度优先的递归函数貌似没有递归好
struct MGraph
{
int vertex[maxvertex]; //存顶点
int arc[maxvertex][maxvertex]; //存边(邻接矩阵)
int vertexnum,arcnum; //顶点数和边数
};

其次是对图的初始化:

void CreatMGraph(MGraph *&G)
{
int i,j;
cin1>>G->vertexnum>>G->arcnum; //输入顶点数和边数

for(i=0;i<G->vertexnum;i++) //输入每个顶点的值
cin1>>G->vertex[i];

for(i=0;i<G->vertexnum;i++) //初始化邻接矩阵
for(j=0;j<G->vertexnum;j++)
G->arc[i][j]=0;

for(i=0;i<G->arcnum;i++)
{
int n,m,w;
cin1>>n>>m>>w; //修改邻接矩阵中的值
G->arc[n][m]=w;
G->arc[m][n]=w;
}
}

在此之前需要定义一个全局变量的visited数组:

int visited[maxvertex]; //标记已被访问过的顶点(全局变量)

//广度优先遍历

void BFS(MGraph *&G,int v)

{
queue<int> q;
int x,j;
if(!visited[v]) //即为visited[v]==0,也就是未被访问过
{
cout<<G->vertex[v]<<" ";
visited[v]=1;
q.push(v); //被访问的顶点入队
}

while(!q.empty()) //队不空进循环
{
x=q.front(); //取队头元素
q.pop(); //队头出队
for(j=0;j<G->vertexnum;j++)
if (G->arc[x][j]&&!visited[j])
{
cout<<G->vertex[j]<<" ";
visited[j]=1; //标记为访问过
q.push(j); //被访问的顶点继续入队
}
}
}

//深度优先遍历
void DFS(MGraph *&G,int v)

{
nt j;
if(!visited[v])

{
cout<<G->vertex[v]<<" ";
visited[v]=1; //标记为访问过
}

for(j=0;j<G->vertexnum;j++)
if (G->arc[v][j]&&!visited[j])//邻接矩阵的第(v,j)元素不为0
{ //且未被访问过则递归
DFS(G,j);
}
}

此为图的邻接矩阵的输出函数:

void Print(MGraph *G)
{
int i,j;
for(i=0;i<G->vertexnum;i++)
{
for(j=0;j<G->vertexnum;j++)
cout<<G->arc[i][j]<<" ";
cout<<endl;
}
}

main函数调用上面函数:

int main()
{
MGraph *G=new MGraph;
CreatMGraph(G);

cout<<"输出邻接矩阵:"<<endl;
Print(G);

cout<<"深度优先搜索:";
DFS(G,0);
cout<<endl;

memset(visited,0,sizeof(visited));//非常重要!!在下一个搜索之前一定要将标志位全部重新赋值为0

cout<<"广度优先搜索:";
BFS(G,0);
cout<<endl;

return 0;
}

热心网友 时间:2023-10-20 12:44

/* Define NULL pointer value */

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
Firstadjvex 和Nextadjvex 在未找到点的情况下不要返回NULL, NULL 在stdio.h 中为0 而0表示第一个点,在未找到结点的情况下最好用-1追问您好 错误找到了 出在 char Nextadjvex(Graph G,char v,char w) /*返回v相对于w的邻接点,若无则返回null*/
{int i,j;
i=locatevex(G,v);
j=locatevex(G,w);
for(j++;G.arcs[i][j]==0;j++)
if(j==G.vexnum) return NULL;
return G.vexs[j];}

if(j==G.vexnum)应把G。vexnum减1 才可以

热心网友 时间:2023-10-20 12:44

老兄,你的问题我正在看,结果运行不对,正如你所说的,而且是细节性的,我再慢慢研究,争取尽快回复你。。。。追问老兄 有结果了吗

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你喜欢外柔内刚的女孩还是外刚内柔的女孩? 男人喜欢外柔内刚还是外刚内柔型的女生 ...怎样涂好颜色啊,用彩笔还是彩铅啊...谢谢啦 ...也转动了,但是里面却没有动静,也没有风不过半分钟就关了,不是... 空调开机没反应,用遥控器点开关没反应,确定不是遥控器问题,空调重新插... 请问一下 上海电信的融合宽带一个月多少钱? 本人男 脸太圆想要瘦脸 不用药 女生初涉期货行业从事什么岗位比较好 为什么较少女生选择做期货交易 我现在就读大学,现在学校里新建一个期货专业,我在考虑转专业_百度知 ... 用邻接矩阵存储无向图,并用深度优先和广度优先遍历搜索输出序列,要能运行的,并把运行的结果截图下来 哪位大侠帮我看一下这道邻接矩阵写出深度优先遍历的题~~~教我方法吧 pta 遍历时用裁判定义的函数 4-2 邻接矩阵存储图的深度优先遍历 (20分) 数据结构C++无向图的邻接矩阵深度优先遍历,求解答 用C语言实现 图的邻接表和邻接矩阵数据结构的定义、创建;图的深度优先遍历、广度优先遍历。 图的遍历:深度优先搜索(邻接矩阵存放) 数据结构 第二小题基于邻接矩阵求从顶点B出发的深度优先遍历。 请问基于邻接矩阵的话深度优先遍历是否 一般送夜客在晚上几点钟好,送的时候该说些什么话迷信类? 已知图的邻接矩阵如图1. 所示,则从顶点0出发按深度优先遍历的结果是( ) 秋月古诗的好段 已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是 巡夜客有难是什么电影 我前几段时间手机话费是15,用手机支付宝的花呗支出话费12元,手机既没有通过任何方式充值话费,几天 有‘夜客’商标的桶装椰子油是什么牌子的在哪能买到 和夜客差不多的交友软件,谢谢! 夜客苹果下不了怎么办 谁知道夜客网是做什么的? 电脑怎么登录2个 怎样在电脑上同时登陆两个 电脑怎么同时登两个 爱丫爱丫舞蹈教学视频 爵士舞能减肥吗 简单易学 vivo哪些手机是康宁大猩猩屏幕的 vivoX7用的是康宁大猩猩屏幕吗 我的是VIVO X510t的手机,我想问我的手机玻璃的康宁的大猩猩玻璃吗? vivonex双屏版和努比亚x哪个好? vivo NEX手机大屏容易碎吗? vivoX21 i 手机的屏幕保护玻璃用的是康宁大猩猩吗?第几代的? 屏幕是大猩猩玻璃吗?第几代的 问一下大神opporeno和vivox27这两款手机用的是康宁大猩猩玻璃几代屏幕,两者看电视电影哪? 吸出的母乳热一下可以放多久 热了的母乳可以放多久 热完一遍的母乳可以放多久 母乳加热后能放多久还可以喝 大学毕业后可以考哪些证? 母乳从冰箱拿出来热之后可以放多久 腿疼 现在大腿肌肉 也有些疼 母乳在恒温壶里可以放多久 孩子经常说腿疼是肌肉疼该怎么办 不知道怎么了腿疼的好像肌肉抽筋 斯达半导面板前景?斯达半导适合价值投资吗?斯达半导今天走势如何?