使用邻接表求拓扑序列

/*实现拓扑序列*/
#include<iostream>
#include<queue>
using namespace std;
#define MAX 100
typedef struct node //节点的结构体
{
	int data ;
	struct node *next ;
}node;
node *e[MAX] ;
int edge[MAX] ;

/*利用加边法建立邻接表*/
void addedge(int v , int w)
{
	node *ptr ;
	ptr = new node;
	ptr->data = w ;
	ptr ->next = e[v];
	e[v] = ptr ;
	return ;
}

/*建立拓扑序列*/
void TopLogicalSort()
{
	queue<int>q ;
	for( int i = 0 ; i < 10 ; i++)
		if(edge[i] == 0 )
			q.push(i) ;
	while(!q.empty())
	{
		int j = q.front() ;
		cout<<j;
		q.pop() ;
		for( node *w = e[j] ; w ; w = w->next)
			if((--edge[w->data]) == 0 )
				q.push(w->data);
	}
}

int main(void)
{
	int i ; 
	memset(edge , 0 ,  sizeof(edge));
	/*利用加边法建立邻接表,并遍历邻接表*/
	cout<<"输入节点(0-10)之内"<<endl;
	for( i = 0 ; i < 10 ; i ++)
	{
		int a , b ;
		cin >> a >> b ;
		edge[b] ++ ;
		addedge(a , b );
	}

	for( i = 0 ; i < 10 ; i++)
	{
		cout<<i<<"的相邻节点是:	  ";
		for( node *w = e[i] ; w ; w = w->next)
			cout<<w->data ;
		cout<<endl;
	}

	cout<<"拓扑序列为: ";
	TopLogicalSort();
	cout<<endl ;

	return 0 ;
}

邻接表推导拓扑序列可以使用Kahn算法和深度优先搜索(DFS)两种方法: ### Kahn算法 Kahn算法基于顶点的入度。入度是指有向中指向该顶点的边的数量。其具体步骤如下: 1. 统计每个顶点的入度:遍历邻接表,统计每个顶点的入度。 2. 将入度为0的顶点入队:将所有入度为0的顶点加入一个队列中。 3. 进行拓扑排序: - 从队列中取出一个顶点,将其加入拓扑序列。 - 遍历该顶点的所有邻接顶点,将这些邻接顶点的入度减1。 - 如果某个邻接顶点的入度变为0,则将其加入队列。 4. 重复步骤3,直到队列为空。 5. 检查拓扑序列的长度:如果拓扑序列的长度等于中顶点的数量,则说明中没有环,拓扑排序成功;否则,中存在环。 以下是Kahn算法的Python代码示例: ```python from collections import deque def kahn_topological_sort(graph): in_degree = {node: 0 for node in graph} # 统计每个顶点的入度 for node in graph: for neighbor in graph[node]: in_degree[neighbor] += 1 # 将入度为0的顶点入队 queue = deque([node for node in in_degree if in_degree[node] == 0]) top_order = [] while queue: node = queue.popleft() top_order.append(node) # 遍历该顶点的所有邻接顶点 for neighbor in graph[node]: in_degree[neighbor] -= 1 if in_degree[neighbor] == 0: queue.append(neighbor) if len(top_order) == len(graph): return top_order else: return None # 中存在环 # 示例邻接表 graph = { 'A': ['B', 'C'], 'B': ['D'], 'C': ['D'], 'D': [] } result = kahn_topological_sort(graph) print(result) ``` ### 深度优先搜索(DFS) 深度优先搜索实现拓扑排序的核心思想是对进行深度优先遍历,当一个顶点的所有邻接顶点都被访问后,将该顶点压入栈中,最后栈中的顶点顺序即为拓扑排序的逆序。具体步骤如下: 1. 初始化一个栈和一个访问标记数组。 2. 对中的每个顶点进行深度优先遍历: - 如果该顶点未被访问,则进行深度优先遍历。 - 在深度优先遍历过程中,递归访问该顶点的所有邻接顶点。 - 当一个顶点的所有邻接顶点都被访问后,将该顶点压入栈中。 3. 从栈中依次弹出顶点,得到拓扑序列。 以下是DFS实现拓扑排序的Python代码示例: ```python def dfs_topological_sort(graph): visited = set() stack = [] def dfs(node): visited.add(node) for neighbor in graph[node]: if neighbor not in visited: dfs(neighbor) stack.append(node) for node in graph: if node not in visited: dfs(node) return stack[::-1] # 示例邻接表 graph = { 'A': ['B', 'C'], 'B': ['D'], 'C': ['D'], 'D': [] } result = dfs_topological_sort(graph) print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值