C语言-数据结构算法-基于图的深度遍历查找所有路径

使用邻接表实现的图的深度优先搜索算法。主要参数含义:

1. 定义了结构体`ArcNode`表示图中的边,包含了一个邻接点的索引和指向下一个边的指针。
2. 定义了结构体`VNode`表示图中的顶点,包含了顶点的编号和指向第一个边的指针。
3. 定义了结构体`Graph`表示整个图,包含了一个顶点数组和顶点的数量。
4. 实现了初始化函数`Init`,用于初始化图的顶点数组。
5. 实现了插入边的函数`Insert`,将边插入到对应顶点的邻接表中。
6. 实现了深度优先搜索算法`DeepSearch`,用递归方式搜索从顶点`u`到顶点`v`的所有路径,并输出这些路径。
7. 在`main`函数中创建一个图,并插入边。然后调用深度优先搜索算法找到从顶点1到顶点5的所有路径。

`DeepSearch`函数中的参数意义如下:

1. `Graph *G`:指向图的指针。该指针指向一个包含所有顶点和边的邻接表。

2. `int u`:表示当前正在遍历的顶点编号。

3. `int v`:表示要到达的目标顶点的编号。

4. `int path[]`:用于存储当前路径上的所有顶点编号,path[d]=u表示第d个顶点是u。

5. `int d`:表示当前路径上的顶点数量,即从起点u到当前顶点的路径长度(从path[1]到path[d])。

6. `int visit[]`:用于标记图中的每个顶点是否被访问过。visit[u]等于1表示顶点u已被访问过,等于0表示未被访问过。在遍历过程中,遍历过的顶点需要标记为已访问,以免下一次重复访问。

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100

typedef struct ArcNode{
	int adjvex;
	ArcNode *nextarc;
}ArcNode;

typedef struct{
	int num;
	ArcNode *firstarc;
}VNode; 

typedef struct{
	VNode adjlist[MaxSize];
	int numNodes;
}Graph;

void Init(Graph *G,int n){
	G->numNodes=n;
	for(int i=1;i<=G->numNodes;i++){
		G->adjlist[i].num=i;
		G->adjlist[i].firstarc=NULL;
	}
}

void Insert(Graph *G,int u,int v){
	ArcNode *node=(ArcNode *)malloc(sizeof(ArcNode));
	node->adjvex=v;
	node->nextarc=NULL;
	ArcNode *p=G->adjlist[u].firstarc;
	if(p==NULL) G->adjlist[u].firstarc=node;
	else{
		while(p->nextarc!=NULL) p=p->nextarc;
		p->nextarc=node;
	}
}

void DeepSearch(Graph *G,int u,int v,int path[],int d,int visit[]){
	static int count=0;
	path[d]=u; visit[u]=1;
	if(u==v){
		printf("第%d条路径为:",++count);
		for(int i=1;i<=d;i++)
			printf("%d",path[i]);
		printf("\n");
		visit[u]=0;
		return;
	}
	else{
		ArcNode *p=G->adjlist[u].firstarc;
		while(p!=NULL){
			if(visit[p->adjvex]==0)
				DeepSearch(G,p->adjvex,v,path,d+1,visit);
			p=p->nextarc;
		}
		visit[u]=0;
	}
}

int main(){
	Graph *G=(Graph *)malloc(sizeof(Graph));
	Init(G,5);
	Insert(G,1,2);Insert(G,1,3);Insert(G,1,4);
	Insert(G,2,1);Insert(G,2,5);
	Insert(G,3,1);Insert(G,3,5);
	Insert(G,4,1);
	Insert(G,5,2);Insert(G,5,3);
	int path[6],visit[6];
	for(int i=1;i<=5;i++) visit[i]=0;
	DeepSearch(G,1,5,path,1,visit);
	return 0;
}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,我们可以通过深度优先搜索算法来获取有向的所有路径。 首先,我们需要定义一个有向的类,并实现相关的方法。在这个类中,我们可以使用邻接矩阵或邻接表的方式来表示有向。 在获取有向所有路径的方法中,我们可以使用递归来实现深度优先搜索。从的某一节点开始,我们遍历它的所有邻居节点,并将当前节点添加到路径中。然后,对每个邻居节点,我们继续递归调用获取路径的方法,直到到达终点或不到邻居节点为止。在递归调用结束后,我们需要从路径中移除当前节点。 具体的代码实现如下所示: ```java import java.util.ArrayList; import java.util.List; public class DirectedGraph { private int numVertices; private List<List<Integer>> adjacencyList; public DirectedGraph(int numVertices) { this.numVertices = numVertices; this.adjacencyList = new ArrayList<>(); for (int i = 0; i < numVertices; i++) { adjacencyList.add(new ArrayList<>()); } } public void addEdge(int src, int dest) { adjacencyList.get(src).add(dest); } public List<List<Integer>> getAllPaths(int src, int dest) { List<List<Integer>> paths = new ArrayList<>(); List<Integer> path = new ArrayList<>(); path.add(src); getAllPathsUtil(src, dest, path, paths); return paths; } private void getAllPathsUtil(int curr, int dest, List<Integer> path, List<List<Integer>> paths) { if (curr == dest) { paths.add(new ArrayList<>(path)); } else { for (Integer neighbor : adjacencyList.get(curr)) { path.add(neighbor); getAllPathsUtil(neighbor, dest, path, paths); path.remove(path.size() - 1); } } } } ``` 使用示例代码来进行测试: ```java public static void main(String[] args) { DirectedGraph graph = new DirectedGraph(4); graph.addEdge(0, 1); graph.addEdge(0, 2); graph.addEdge(1, 2); graph.addEdge(2, 0); graph.addEdge(2, 3); graph.addEdge(3, 3); int src = 2; int dest = 3; List<List<Integer>> paths = graph.getAllPaths(src, dest); for (List<Integer> path : paths) { for (int node : path) { System.out.print(node + " -> "); } System.out.println(); } } ``` 以上代码将会输出所有从节点2到节点3的路径

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值