邻接矩阵版
天津大学2013算法设计题
一个用邻接矩阵存储的有向图,请用栈实现该图的深度优先搜索算法
(啊啊啊啊啊啊啊啊我看错题了,我把他当非递归写了,明明直接默递归代码就可以了
关键代码:
#define maxsize 100
typedef struct{
int virticle[maxsize];
int numver,numedg;
int Edge[maxsize][maxsize];
}MGraph;
void nonDFS(MGraph G,int v)
{
int stack[maxsize];// 定义栈
int visit[maxsize]={0};// 访问标记数组
int top=-1;
// 初始节点入栈并标记
cout<<v<<" ";
stack[++top]=v;
visit[v]=1;
while(top!=-1)
{
int node=stack[top];
bool flag =false;
for(int i=0;i<G.numver;i++)
{
if(G.Edge[node][i]==1&&visit[i]==0) // 如果找到未访问的邻接点
{
stack[++top]=i;// 入栈
visit[i]=1;
cout<<i<<" ";
flag=true;
break; // 找到一个未访问的节点后退出内循环
}
}
if(flag==false)// 如果没有未访问的邻接点,出栈
top--;
}
}
邻接表版
关键代码:
typedef struct ANode{
int adjvex;//边所指向节点的位置
struct ANode *nextarc;
}ANode,*Node;//边节点结构体
typedef struct{
int data;
ANode *firstarc;
}Vnode;//顶点结构体
typedef struct{
Vnode adjlist[maxsize];
int numver,numedg;
}Graph;
void NonDFS(Graph G,int v)
{
int visit[maxsize]={0};
int stack[maxsize];
int top=-1;
cout<<v<<" ";
visit[v]=1;
stack[++top]=v;
while(top!=-1)
{
int node=stack[top];
Node p=G.adjlist[node].firstarc;
while(p&&visit[p->adjvex]!=0)
{
p=p->nextarc;
}
if(p==NULL)
--top;
else{
cout<<p->adjvex<<" ";
visit[p->adjvex]=1;
stack[++top]=p->adjvex;
}
}
}
对于邻接矩阵存储的图的非递归深度优先遍历的代码完整版:
#include<iostream>
using namespace std;
#define maxsize 100
typedef struct{
int virticle[maxsize];
int numver,numedg;
int Edge[maxsize][maxsize];
}MGraph;
void nonDFS(MGraph G,int v)
{
int stack[maxsize];// 定义栈
int visit[maxsize]={0};// 访问标记数组
int top=-1;
// 初始节点入栈并标记
cout<<v<<" ";
stack[++top]=v;
visit[v]=1;
while(top!=-1)
{
int node=stack[top];
bool flag =false;
for(int i=0;i<G.numver;i++)
{
if(G.Edge[node][i]==1&&visit[i]==0) // 如果找到未访问的邻接点
{
stack[++top]=i;// 入栈
visit[i]=1;
cout<<i<<" ";
flag=true;
break; // 找到一个未访问的节点后退出内循环
}
}
if(flag==false)// 如果没有未访问的邻接点,出栈
top--;
}
}
int main()
{
MGraph G;//创建一个邻接矩阵存储的有向图
int n,m;
cin>>n;
G.numver=n;
G.numedg=m;
for(int i=0;i<G.numver;i++)
G.virticle[i]=i;
for(int i=0;i<G.numver;i++)
for(int j=0;j<G.numver;j++)
G.Edge[i][j]=0;
for(int i=0;i<G.numedg;i++)
{
int v1,v2;
cin>>v1>>v2;
G.Edge[v1][v2]=1;
}
for(int i=0;i<G.numver;i++)
{
for(int j=0;j<G.numver;j++)
cout<<G.Edge[i][j]<<" ";
cout<<endl;
}
nonDFS(G,0);
}
6233

被折叠的 条评论
为什么被折叠?



