图的深度优先遍历(类似树的先序遍历)
广度优先遍历(类似树的层次遍历)
树的孩子表示法(孩子链表法)
图的遍历时间复杂度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;
}