dfs
1.邻接矩阵
#include<stdio.h>
#include<string.h>
#define MVNum 10 //最大顶点数
typedef struct{
char vexs[MVNum]; //顶点表
int arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum;
}AMGraph;
int visited[MVNum];
void create(AMGraph &g);
void dfs(AMGraph &g, int v);
int main(){
AMGraph g;
create(g);
memset(visited, 0, sizeof(visited));
dfs(g, 0);
printf("\n");
}
void create(AMGraph &g){
int n,m;
scanf("%d %d",&n,&m);getchar();
g.vexnum=n;g.arcnum=m;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
g.arcs[i][j]=0;
for(int i=0;i<n;i++){
g.vexs[i]=getchar();
getchar();
}
int tx,ty;
for(int i=0;i<m;i++){char tc1,tc2;
scanf("%c %c",&tc1,&tc2);getchar();
for(int j=0;j<n;j++){
if(tc1==g.vexs[j])
tx=j;
if(tc2==g.vexs[j])
ty=j;
}
g.arcs[tx][ty]=1;
g.arcs[ty][tx]=1;
}
}
void dfs(AMGraph &g, int v){
printf("%c ",g.vexs[v]);
visited[v]=1;
for(int o=0;o<g.vexnum;o++){
if(g.arcs[v][o]==1&&visited[o]==0)//有边且未递归到此节点
dfs(g,o);
}
}
2.邻接表
include<stdio.h>
#include<string.h>
#define MVNum 10
typedef struct ArcNode {
int adjvex; // 顶点下标
struct ArcNode *nextarc; // 指向下一条边的指针
}ArcNode; // 顶点信息
typedef struct {
char data; // 数据域,存放数据
ArcNode *firstarc; // 指向第一条边的指针
}VNode; // 表头结点
typedef struct
{ VNode vexs[MVNum]; // 顶点数组(表头结点组成的数组)
int vexnum, arcnum;
}ALGraph;
int visited[MVNum];
void create(ALGraph &g); // 邻接表中的表结点采用头插法
void dfs(ALGraph &g, int v);
int main(){
ALGraph g;
create(g);
memset(visited, 0, sizeof(visited));
dfs(g, 0);
printf("\n");
}
void create(ALGraph &g){
int n,m;
scanf("%d %d",&n,&m);getchar();
g.vexnum=n;g.arcnum=m;
for(int i=0;i<n;i++){
scanf("%c",&g.vexs[i].data);
getchar();
g.vexs[i].firstarc = NULL;
}
for(int o=0;o<m;o++){
char u,v;
scanf("%c",&u);getchar();
scanf("%c",&v);getchar();
int i,j;
for(int k=0;k<n;k++){
if(u==g.vexs[k].data)
i=k;
if(v==g.vexs[k].data)
j=k;
}
ArcNode *pu,*pv;
pu = new ArcNode;
pu->adjvex=i;
pu->nextarc = g.vexs[j].firstarc;
g.vexs[j].firstarc=pu;
pv = new ArcNode;
pv->nextarc = g.vexs[i].firstarc;
pv->adjvex=j;
g.vexs[i].firstarc=pv;
}
}
void dfs(ALGraph &g, int v){//v为顶点数组的下标
printf("%c ",g.vexs[v].data);
visited[v]=1;
ArcNode *p = g.vexs[v].firstarc;
while(p){
if(visited[p->adjvex]==0)//有边且未递归到此节点
dfs(g,p->adjvex);
p=p->nextarc;
}
}
bfs
1.
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define MVNum 10 //最大顶点数
typedef struct{
char vexs[MVNum]; //顶点表
int arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum;
}AMGraph;
int visited[MVNum];
void create(AMGraph &g);
void bfs(AMGraph &g, int v);
int main(){
AMGraph g;
create(g);
memset(visited, 0, sizeof(visited));
bfs(g, 0);
}
void create(AMGraph &g){
int n,m;
scanf("%d %d",&n,&m);getchar();
g.vexnum=n;g.arcnum=m;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
g.arcs[i][j]=0;
for(int i=0;i<n;i++){
g.vexs[i]=getchar();
getchar();
}
int tx,ty;
for(int i=0;i<m;i++){char tc1,tc2;
scanf("%c %c",&tc1,&tc2);getchar();
for(int j=0;j<n;j++){
if(tc1==g.vexs[j])
tx=j;
if(tc2==g.vexs[j])
ty=j;
}
g.arcs[tx][ty]=1;
g.arcs[ty][tx]=1;
}
}
void bfs(AMGraph &g, int v){
queue<int> q;
printf("%c ",g.vexs[v]);
visited[v]=1;//当第一个则=1
q.push(v);
while(!q.empty()){
int u = q.front();
q.pop();
for(int i=0;i<g.vexnum;i++){
if(visited[i]==0&&g.arcs[u][i]==1){//如果邻接且未当过头
printf("%c ",g.vexs[i]);
visited[i]=1;
q.push(i);
}
}
}
}
2.
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define MVNum 10
typedef struct ArcNode {
int adjvex; // 位置(下标)
struct ArcNode *nextarc; // 指向下一条边的指针
}ArcNode; //顶点信息(普通节点)
typedef struct {
char data; // 数据域,存放数据
ArcNode *firstarc; // 指向第一条边的指针
}VNode; // 表头结点
typedef struct
{ VNode vexs[MVNum]; // 顶点数组(表头结点组成的数组)
int vexnum, arcnum;
}ALGraph;
int visited[MVNum];
void create(ALGraph &g); // 邻接表中的表结点采用头插法
void bfs(ALGraph &g, int v);
int main(){
ALGraph g;
create(g);
memset(visited, 0, sizeof(visited));
bfs(g, 0);
}
void create(ALGraph &g){
int n,m;
scanf("%d %d",&n,&m);getchar();
g.vexnum=n;g.arcnum=m;
for(int i=0;i<n;i++){
scanf("%c",&g.vexs[i].data);
getchar();
g.vexs[i].firstarc = NULL;
}
for(int o=0;o<m;o++){
char u,v;
scanf("%c",&u);getchar();
scanf("%c",&v);getchar();
//找到输入的两边的下标 i,j
int i,j;
for(int k=0;k<n;k++){
if(u==g.vexs[k].data)
i=k;
if(v==g.vexs[k].data)
j=k;
}
ArcNode *pu,*pv;
pu = new ArcNode;
pu->adjvex=i;
pu->nextarc = g.vexs[j].firstarc;//插入到另一个的头节点后面
g.vexs[j].firstarc=pu; //同上
pv = new ArcNode;
pv->nextarc = g.vexs[i].firstarc;
pv->adjvex=j;
g.vexs[i].firstarc=pv;
}
}
void bfs(ALGraph &g, int v){
int w;
queue <int> q;
q.push(v);//入队
visited[v]=1;
while(!q.empty()){//此循环寻找遍历/寻找 刚出队的点 的(所有)连接点
w = q.front();
q.pop();//出队便打印
printf("%c ",g.vexs[w].data);
//p为临时指针用于遍历/寻找 刚出队的点 的连接点
ArcNode *p = g.vexs[w].firstarc;
while(p){
if(visited[p->adjvex]==0){//判断该点是否已入队(入队过),若否 则入队,并在visited记录
q.push(p->adjvex);
visited[p->adjvex]=1;
}
p=p->nextarc;
}
}
}
C语言(邻接矩阵,邻接表实现dfs,bfs)
最新推荐文章于 2024-05-18 08:52:07 发布