DFS(深度优先搜索)和BFS(广度优先搜索)是两种最基本的搜索方法,不仅是在图论中在其他很多方面都有应用,也就是说,dfs和bfs是ACM的基础,要熟练掌握他们就要深刻理解它们的搜索原理。那么图的深搜和广搜也是图论的基础,许多知识点都会应用到搜索,比如拓扑排序,深搜和广搜的定义就不说了,下面是图的dfs和bfs搜索代码:
下面采用邻接表存储结构实现:
//图的深度优先搜索
//邻接表
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stack>
#define Max 100 //顶点个数最多为100个
using namespace std;
typedef char type;
typedef struct Arcnode{
int index;
int value;
struct Arcnode *next;
}Arcnode,*parc;
typedef struct Node{
type data;
Arcnode *first;
}Node;
typedef struct Grap{
Node nodetex[Max];
int n; //顶点数
int m; //边数
}Grap,*pgrap;
bool visit[Max];
int Located(pgrap g,char ch){
for(int i=0;i<g->n;i++)
if(ch==g->nodetex[i].data)
return i;
}
void Creat_grap(pgrap g){
printf("输入图的结点数和边数:\n");
scanf("%d%d",&g->n,&g->m);
getchar();
int i,index1,index2,value;
char ch1,ch2;
printf("输入各顶点:\n");
for(i=0;i<g->n;i++){
g->nodetex[i].data=getchar();
g->nodetex[i].first=NULL;
getchar();
}
printf("输入各边及权值:\n");
parc q;
for(i=0;i<g->m;i++){
scanf("%c,%c,%d",&ch1,&ch2,&value);
getchar();
index1=Located(g,ch1);
index2=Located(g,ch2);
q=(parc)malloc(sizeof(Arcnode));
q->index=index2;
q->value=value;
q->next=g->nodetex[index1].first;
g->nodetex[index1].first=q;
//无向图(默认为任意两个顶点之间之多有一条边且自身到自身无边)
q=(parc)malloc(sizeof(Arcnode));
q->index=index1;
q->value=value;
q->next=g->nodetex[index2].first;
g->nodetex[index2].first=q;
}
}
void Delete_grap(pgrap g){
parc p,q;
for(int i=0;i<g->n;i++){
p=g->nodetex[i].first;
while(p){
q=p->next;
free(p);
p=q;
}
}
}
//递归算法
/*void dfs(pgrap g,int v){
printf("访问结点: ");
putchar(g->nodetex[v].data);
visit[v]=1;
parc p=g->nodetex[v].first;
while(p){
if(!visit[p->index])
dfs(g,p->index);
p=p->next;
}
}*/
//非递归算法
void dfs(pgrap g,int v){
stack<int> s;
s.push(v);
int index;
while(!s.empty()){
ind