真的大一菜鸟的dfs
dfs:
void dfs(int st,int g[][max])//必须给一个顶点开始搜索
{
static int vis[max]={0};
//用于记录有没有被访问
vis[st]=1;
//开始找说有项链的节点中没有被访问过的节点
printf("%2d->",st);
for(int i=0;i<v;i++)
{
//条件:1相连2未访问
if(g[st][i]==1&&vis[i]==0)
{
dfs(i,g);
}
}
}
bfs;
void bfs(int st,int g[][max])
{
//用于存储访美访问过的数据
int vis[max]={0};
//定义队列,
int que[max],h,r,temp;
//空
h=r=0;
//尾进
que[r]=st;
r++;
vis[st]=1;
while(h!=r)
{
//出一个已经记住的元素;
temp=que[h];
h++;
//vis[temp]=1;
printf("%3d->",temp);
for(int i=0;i<v;i++)
{
if(g[temp][i]==1 &&vis[i]==0)
{
que[r]=i;
r++;
vis[i]=1;
}
}
}
}
完整代码
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define max 100
int v,E;
void Initial(int g[][max],int data[max][max])
{
//输入边数减少空间
for(int i=0;i<E;i++)
{
for(int j=0;j<E;j++)
{
int tmpi,tmpj;
tmpi=data[i][0];//tmpi为起始顶点
tmpj=data[i][1];//tmpj为终止顶点
g[tmpi][tmpj]=1;//有边的点填入1
}
}
}
void dfs(int st,int g[][max])//必须给一个顶点开始搜索
{
static int vis[max]={0};
vis[st]=1;
//开始找说有项链的节点中没有被访问过的节点
printf("%2d->",st);
for(int i=0;i<v;i++)
{
//条件:1相连
if(g[st][i]==1&&vis[i]==0)
{
dfs(i,g);
}
}
}
void Dispaly(int g[][max])
{
for(int i=0;i<v;i++)
{
for(int j=0;j<v;j++)
{
printf("%4d",g[i][j]);
}
printf("\n");
}
}
void bfs(int st,int g[][max])
{
//用于存储访美访问过的数据
int vis[max]={0};
//定义队列,
int que[max],h,r,temp;
//空
h=r=0;
//尾进
que[r]=st;
r++;
vis[st]=1;
while(h!=r)
{
//出一个已经记住的元素;
temp=que[h];
h++;
//vis[temp]=1;
printf("%3d->",temp);
for(int i=0;i<v;i++)
{
if(g[temp][i]==1 &&vis[i]==0)
{
que[r]=i;
r++;
vis[i]=1;
}
}
}
}
int main()
{
int G[max][max];
int data[max][max];
scanf("%d%d",&v,&E);
for(int i=0;i<E;i++)
{
for(int j=0;j<2;j++)
{
scanf("%d",&data[i][j]);
}
}
memset(G,0,sizeof(G));
Initial(G,data);
dfs(G[0][0],G);
bfs(G[0][0],G);
Dispaly(G);
return 0;
}
//横着读第i行,可以读出1和其他相连
0 1 1 1 0 0 0
0 0 0 0 1 1 1
0 0 0 0 0 0 1
0 0 0 0 0 0 0
0 0 0 0 0 1 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0