C语言实现图遍历与Dijkstra算法:深度优先与广度优先搜索

创始人
2024-12-15 06:34:02
0 次浏览
0 评论

用C语言编程,做出的给分

输入图顶点和弧弧数CreateteGraph(G);//邻接表结构DFSTravers(G);//深度优先搜索遍历图BFSTravers(G);//广度优先搜索遍历图printf("图遍历完成,继续)生成图表继续吗?*s;for(i=1;i<=G.vexnum;i++)G.AdjList[i]=NULL;//初始化指针数组for(i=1;i<=G.arcnum;i++){scanf("%d,%d",&start,&end);//输入圆弧的起点和终点s=(ArcNode*)malloc(sizeof(ArcNode));//生成圆弧节点s->nextarc=G.AdjList[start];//插入邻接表s->adjvex=end;G.AdjList[start]=s;if(G.GraphKind==0)//如果是一个间接是一个图,然后向其中插入一条弧链中的终点{s=(arcNode*)malloc(size(arcNode));s->nextarc=G.AdjList[end];s->adjvex=start;G.AdjList[结束]=S;)visited[i]=False;//(i=1;i<=G.vexnum;i++)if(!visited[i])DFS(G,i);//初始化未访问Vertex调用的访问标志数组dfSprintf("\b\b\n");}voidDFS(GraphG,inti){//从第i个顶点开始递归遍历图Gintw的深度;第个顶点Printf("%d->",i);for(w=FirstAdjVex(G,i);w;w=NextAdjVex(G,i,w))if(!visited[w])DFS(G,w);//尚未访问过的相邻顶点w称为DFS}voidBFSTravers(GraphG).Q;printf('bfsreverse:');for(i=1;i<=G.vexnum;i++)visited[i]=False;//访问标志数组初始化初始化(Q);//…(i=1;i<=G.vexnum;i++)if(!visited[i]){visited[i]=True;//转到顶部iprintf("%d->",开始i的队列);入队(Q,i);//将序号i放入队列while(!QueueEmpty(Q))//如果队列不为空,则继续{DeQueue(Q,u);//删除队列的主元素,并用ufor(w=KeepasFirstAdjVex(G,u);w;w=NextAdjVex(G,u,w))if(!visited[w])//访问未访问的相邻顶点w并将其放入队列中{访问[w]=True;printf("%d->",w);EnQueue(Q,w);}}}printf("\b\b\n");}intFirstAdjVex(GraphG,intv){//查找图G中的第v个顶点if相邻顶点(!G.AdjList[v])return0;elsereturn(G.AdjList[v]->adjvex);}intNextAdjVex(GraphG,intv,intu){//图GArcNode*p;p=G.AdjList[v];while(p->adjvex)查找第v个顶点相对于你的下一个相邻顶点!=u)p=p->nextarc;//查找顶点v的弧链中的顶点uif(p->nextarc==NULL)return0;//如果这是最后一个顶点,则返回0elsereturn(p->nextarc->adjvex);//返回下一个相邻顶点的序号}voidInitial(SqQueue&Q){//队列初始化Q.front=Q.rear=0;}BOOLQueueEmpty(SqQueueQ){//判断队列是否为空,如果为空则返回True,否则返回Falseif(Q.front==Q.rear)returnTrue;elsereturnFalse;}returnBOOLenQueue(SqQueue&Q,intch){//进入队列,成功返回True,失败返回Falseif((Q.rear+1)%MAXQSIZE==Q.前)returnFalse;Q.elem[Q.rear]=ch;Q.rear=(Q.rear+1)%MAXQSIZE;returnTrue;}BOOLDeQueue(SqQueue&Q,int&ch){//出队,成功则返回True,用ch返回元素值,否则Falseif(Q.front==Q.rear)returnFalse;ch=Q.elem[Qfront];Q..front=(Q)return.front+1)%MAXQSIZE;returnTrue;//成功删除队列,返回True}

c语言编写路线

#include#include#include#defineMAX100#defineMAXNUM10000000intprevious[MAX-1];//需要intpp[MAX-1]来查找路径;//注册最短路径typedefstructgraphnode{intvexnum;//顶点intarcnum;//弧intgra[MAX][MAX];//邻接矩阵0或1}graph;代表intdist[MAX];//最短距离intarc[MAX][MAX];//对intmain(){voidDijkstra(graph*g,intv);inti,j,n,m;intv;//来源点图*G;G=(graph*)malloc(size(graph));printf("vexnum:\n");scanf("%d",&G->vexnum);printtf("arcnum:\n");scanf("%d",&G->arcnum);printf("图:\n");for(i=0;ivexnum;i++)for(j=0;jvexnum;j++){scanf("%d",&G->gra[i][j]);}for(i=0;ivexnum;i++)for(j=0;jvexnum;j++){if(G->gra[i][j]==1){printf()"请输入从%d到%d的重量:",i,j);scanf("%d",&arc[i][j]);//如果有弧线,则直接输入从i开始的重量toJ}elearc[i][j]=MAXNUM;}printf("请来源点v输入值:");scanf("%d",&v);Dijkstra(G,v);printf("请输入要访问的源点:\n");scanf("%d",&n);pp[0]=0;i=1;m=n;//注册n值while(n!=0)//求从0到其他点的路径{pp[i]=prev[n];i++;n=前一个[n];}printf("路径:0->");for(j=G->vexnum-1;j>=0;j--)if(pp[j]!=0)printf("%d->",pp[j]);printf("%d\n",m);返回0;}voidDijkstra(graph*g,intev){intprevious[MAX-1];intnewdist;boolsign[MAX];if(v<0>MAX-1){printf("该源点不存在!\n")for(inti=0;ivexnum;i++);{距离[i]=arc[v][i];符号[i]=假;if(dist).)if((!si)gn[j])&&(dist[j]vexnum;j++)if((!symbol[j])&&(arc[u][j]vexnum;i++)if(dist[i]!=MAXNUM)printf("从%d到%的最大值d最短路径%d\n",v,i,dist[i]);elseprintf("没有从%d到%d\n的捷径",v,i);printf("\n");}这是Dijkstra算法寻找单源的最短算法,程序假设从0开始,搜索整个图,然后找到0到其他点的最短距离,保存在dist数组中从0到到其他点的路线可能会满足您的要求

请问C语言中for(i=0,i<G.vexnum,++i)与for(i=0,i<G.vexnum,i++)有什么区别?

首先,这种写法根本就是错误的,因为for必须包含至少两个分号,而不是逗号。
其次,如果我们只关注这句话的明显含义,那就没有区别。
只有i++和++i,是有区别的。
热门文章
1
高效掌握:CMD命令轻松启动、关闭及登录... 如何用cmd命令快速启动和关闭mysql数据库服务开发中经常使用MySQL数据库...

2
MySQL分区删除技巧与8.0版本新特性... mysql删除分区在MySQL中,删除分区操作主要使用“可替代”的命令与“ dr...

3
Python代码实现:如何判断三角形的三... python三角形三条边长,判断能否构成三角形Python三角形的三个长边如下:...

4
深度解析:MySQL查询语句执行顺序及优... mysql查询语句执行顺序当这是由于执行SQL的过程时,了解其过程很重要。 ...

5
SQL教程:使用SUBSTRING和IN... sql取特定字符的前面几位字符selectsubstr('L-0FCLDRBCT...

6
MySQL日期差异计算方法:轻松获取日期... MySQL计算时间差两日期相减得月份mysql两时间相减得月MySQL计算时间之...

7
MySQL及SQL查询获取前10条数据方... MySql查询前10条数据sql语句是从MySQL获取前1 0个数据的SQL查询...

8
MySQL启动问题排查与解决指南 Mysql为什么启动不了如果要配置MySQL,则遇到无法启动的问题,可能是由于配...

9
DbVisualizer添加MySQL数... 如何在DbVisualizer中添加本地mysql数据库由于DbVisualiz...

10
SQL字段默认值设置全攻略:轻松实现自动... sql如何设置字段默认值设置SQL中某个字段的默认值;需要遵循几个步骤。首先您需...