图的深度优先遍历和广度优先遍历

图的深度优先遍历(类似树的先序遍历)
广度优先遍历(类似树的层次遍历)

树的孩子表示法(孩子链表法)

图的遍历时间复杂度O(m+n)或O(V^2)

邻接表表示时,查找所有顶点的邻接点所需时间为O(E),访问顶点的邻接点所花时间为O(V),此时,总的时间复杂度为O(V+E)。

邻接矩阵表示时,查找每个顶点的邻接点所需时间为O(V),要查找整个矩阵,故总的时间度为O(V^2)。

v为图的顶点数,E为边数。

#include<stdio.h>
#include <string.h> 
#include<stdlib.h>

//无向图的邻接表
#define Mv 100;//the max number of vertex


typedef struct vn //顶点数组
{
 float price;
  arcn *next;//注意注意注意注意注意注意注意注意注意注意注意注意注意注意
} vn,adjlist[100];


typedef struct arcn //边类型
{
 int 下一个端点;
  arcn *next;
} arcn;


typedef struct  //图的构成
{
adjlist v;
int vnum,arcnum;
} Gra;





int creatG(Gra *G)//图的创建方法
{
 scanf("%d%d",&G->vnum,&G->arcnum);
 printf("图书信息:%d  %d\n",G->vnum,G->arcnum);//定点数  边数

 for(int i=0;i<G->vnum;i++)//定点的初始化
 {
	 G->v[i].price=i;
	 G->v[i].next=NULL;
 }


  for(int j=0;j<G->arcnum;j++)
 {
	 int v1,v2;
    scanf("%d%d",v1,v2);//两端的序号
	arcn *p1= new arcn;//创造边节点


	p1->下一个端点=v1;//一端:下一个的编号,只是记录一个(位置的)值

	p1->next=(G->v[v2]).next;//另一端
	(G->v[v2]).next=p1;
	arcn *p2= new arcn;//创造边节点 无向图的对称性
	p2->下一个端点=v2;//一端:下一个的编号

	p2->next=(G->v[v1]).next;//另一端
	(G->v[v1]).next=p2;

 }








 int aaahhh;scanf("%d",aaahhh); //防止运行完一闪而过
 
 return 0;

}





 int main()
 { 
	 Gra G;
	int c= creatG(&G); 

	 return 0;

 }

在这里插入图片描述

#include<stdio.h>
#include <string.h> 
#include<stdlib.h>

//无向图的邻接表
#define Mv 100;//the max number of vertex
int visited[5]={0,0,0,0,0};
int shuru=0;


typedef struct arcn //边类型
{
 int 下一个端点;
  arcn *next;
} arcn;
typedef struct vn //顶点数组
{
 float price;
  arcn *next;//注意注意注意注意注意注意注意注意注意注意注意注意注意注意
} vn,adjlist[100];





typedef struct  //图的构成
{
adjlist v;
int vnum,arcnum;
} Gra;





int creatG(Gra *G)//图的创建方法
{printf("请输入顶点数  边数");
 scanf("%d%d",&G->vnum,&G->arcnum);
 printf("图书信息:%d  %d\n",G->vnum,G->arcnum);//定点数  边数

 for(int i=0;i<G->vnum;i++)//定点的初始化
 {
	 G->v[i].price=i*10;
	 G->v[i].next=NULL;
 }


  for(int j=0;j<G->arcnum;j++)
 {
	 
	 int v1=0;int v2=3;
	 for(;shuru<6;shuru++)
	 {if(shuru==0){ v1=0; v2=3;};
	  if(shuru==1){ v1=0; v2=1;};
	  if(shuru==2){ v1=3; v2=2;};
	  if(shuru==3){ v1=1; v2=2;};
	  if(shuru==4){ v1=4; v2=2;};
	  if(shuru==5){ v1=1; v2=4;};
	 }
	 printf("请输入两个端点的序号,例如 0 3");
// scanf("%d%d",v1,v2);//两端的序号
	arcn *p1= new arcn;//创造边节点


	p1->下一个端点=v1;//一端:下一个的编号,只是记录一个(位置的)值

	p1->next=(G->v[v2]).next;//另一端
	(G->v[v2]).next=p1;
	arcn *p2= new arcn;//创造边节点 无向图的对称性
	p2->下一个端点=v2;//一端:下一个的编号

	p2->next=(G->v[v1]).next;//另一端
	(G->v[v1]).next=p2;

 }









 
 return 0;

}



void DFS(Gra *G, int k)
{
//图G为邻接矩阵类型,从第v个便点出发深度优先搜索遍厉图。
printf("输出信息");
visited[k]=true;
arcn *p=G->v[k].next;

while(p!=NULL)//边结点非空
{int w=p->下一个端点;
if(!visited[w])
  DFS(G,w);
  p=p->next;
}

}


 int main()
 { 
	 Gra G;
	int c= creatG(&G); 
	int k=0;
	DFS( &G,  k);
	 int aaahhh=0;scanf("%d",aaahhh); //防止运行完一闪而过
	 return 0;

 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值