//深度优先和广度优先
#include<iostream>
#include<malloc.h>
#define Vnum 20
using namespace std;
typedef struct arcnode
{
int adjvex;
struct arcnode *nextarc;
}arcnode;
typedef struct vexnode
{
int vervex;
arcnode *firstarc;
}adjlist[Vnum];
typedef struct graphs
{
adjlist a_list;
int vexnum,arcnum;
}graph;
void create(graph *g)
{
arcnode *p;
int edge[][2]={{1,0},{0,3},{1,2},{2,3},{0,1},{2,0}};
int n=4,e=6;
g->vexnum=4;
g->arcnum=6;
for(int k=0;k<n;k++)
{
g->a_list[k].vervex=k;
g->a_list[k].firstarc=NULL;
}
for(int k=0;k<e;k++)
{
int i=edge[k][0];
int j=edge[k][1];
p=(arcnode *)malloc(sizeof(arcnode));
p->adjvex=j;
p->nextarc=g->a_list[i].firstarc;
g->a_list[i].firstarc=p;
}
}
void dis(graph *g)
{
arcnode *p;
for(int i=0;i<g->vexnum;i++)
{
p=g->a_list[i].firstarc;
while(p!=NULL)
{
cout<<"("<<i<<","<<p->adjvex<<")";
p=p->nextarc;
}
}
cout<<endl;
}
void dfs(graph g,int v,int visit[])
{
cout<<v<<" ";
visit[v]=1;
arcnode *p;
p=g.a_list[v].firstarc;
while(p!=NULL)
{
if(!visit[p->adjvex])
{
dfs(g,p->adjvex,visit);
}
p=p->nextarc;
}
//cout<<endl;
}
/*
==============================================
//=这还有问题,不知道怎么的,它不像递归求得那么好,没能够完全遍历一个图。
void dfs1(graph g,int v)//模拟栈深度非递归遍历图
{
int visit[Vnum];
for(int i=0;i<Vnum;i++)
{
visit[i]=0;
}
int stack[Vnum],top=-1;
arcnode *p;
cout<<v<<" ";
visit[v]=1;
top++;
stack[top]=v;
while(top>=0)
{
v=stack[top];
top--;
p=g.a_list[v].firstarc;
while(p!=NULL&&visit[p->adjvex])
{
p=p->nextarc;
// top++;
// stack[top]=p->adjvex;
}
if(p!=NULL)
{
v=p->adjvex;
top++;
stack[top]=v;
cout<<v<<" ";
visit[v]=1;
}
else top--;
}
cout<<endl;
}
*/
/*
//这是我写的,有错呀。段错误
void dfs1(graph g,int v)
{
int stack[Vnum],top=-1;
int visit[Vnum];
for(int i=0;i<Vnum;i++)
{
visit[i]=0;
}
arcnode *p;
top++;
stack[top]=v;
// p=g.a_list[v].firstarc;
visit[v]=1;
cout<<v<<" ";
while(top>=0)
{
v=stack[top];
top--;
p=g.a_list[v].firstarc;
while(p!=NULL&&!visit[p->adjvex])
{
top++;
stack[top]=p->adjvex;
visit[p->adjvex]=1;
p=p->nextarc;
v=p->adjvex;
cout<<v<<" ";
}
// if(p==NULL)
// top--;
}
cout<<endl;
}
*/
void dfs1(graph g,int v)
{
int i;
arcnode *p;
int visit[Vnum],top=-1,stack[Vnum];
for(i=0;i<g.vexnum;i++)
{
visit[i]=0;
}
cout<<v<<" ";
top++;
stack[top]=v;
visit[v]=1;
while(top>=0)
{
v=stack[top];
top--;
p=g.a_list[v].firstarc;
while(p!=NULL&&visit[p->adjvex])
{
p=p->nextarc;
}
if(p==NULL)
top--;
else
{
v=p->adjvex;
cout<<v<<" ";
visit[v]=1;
top++;
stack[top]=v;
}
}
cout<<endl;
}
void bfs(graph g,int v)
{
int queue[Vnum],rear=0,first=0;
arcnode *p;
int visit[Vnum];
for(int i=0;i<Vnum;i++)
{
visit[i]=0;
}
rear++;
queue[rear]=v;
// cout<<v<<" ";
visit[v]=1;
while(first!=rear)
{
first++;
v=queue[first];
p=g.a_list[v].firstarc;
while(p!=NULL)
{
if(!visit[p->adjvex])
{
rear++;
queue[rear]=p->adjvex;
visit[p->adjvex]=1;
}
p=p->nextarc;
}
cout<<v<<" ";
// visit[v]=1;
}
cout<<endl;
}
int outdegree(graph g,int v)
{
arcnode *p;
// int n=g->vexnum;
p=g.a_list[v].firstarc;
int n=0;
while(p!=NULL)
{
n++;
p=p->nextarc;
}
return n;
}
void connect(graph g)
{
// arcnode *p;
int visit[Vnum];
for(int i=0;i<Vnum;i++)
{
visit[i]=0;
}
dfs(g,0,visit);
int flag=0;
for(int i=0;i<g.vexnum;i++)
{
if(!visit[i]) flag=1;break;
}
if(flag) cout<<"回环"<<endl;
else cout<<"不回环"<<endl;
}
int main()
{
graph g;
create(&g);
dis(&g);
int visit[Vnum];
for(int i=0;i<Vnum;i++)
{
visit[i]=0;
}
int v;
cin>>v;
dfs(g,v,visit);
cout<<endl;
dfs1(g,v);
bfs(g,v);
cout<<"出度为:"<<outdegree(g,v)<<endl;
connect(g);
return 0;
}
今天对于图又有了更深的理解,可是还是有问题,那个非递归的深度优先不知道怎么的,好像不能够完全遍历。有点郁闷呀。
最新推荐文章于 2020-07-30 16:31:15 发布