`

图论----拓扑排序

 
阅读更多

     拓扑排序是,将有向图中每个点按照一定的顺序排列。如果有向边 vi->vj存在,那么vi结点必须出现在vj之前。

    算法思想:

    (1)首先我们利用邻接表保存图结构。

    (2)利用一个数组indegree[]数组来记录每个结点的入度。

    (3)将入度为0的点加入到堆栈 stack中。

    (4)将结点node出栈,清除node发出每一条边node->to,并将indegree[to]--。

    (5)继续寻找入度为0的点,加入栈,直到栈为空。

     时间复杂度:O(V+E)

#include <iostream>
#include <stack>
using namespace std;

const int MAXN = 1000;

struct Edge
{
	int to;
	int value;
	int next;

	Edge()
	{
		value = 0;
		next = -1;
	}
}e[MAXN*2];

int head[MAXN];
int indegree[MAXN];
int edgeNum = 0; //全局唯一标示,边的数目
int v; //结点数目

void addEdge(int from,int to)
{
    e[edgeNum].to  = to;
	e[edgeNum].next = head[from];
	head[from] = edgeNum++;
}

bool findZeroIndegree(int& vert)
{
	for ( int i = 1; i <= v; i++ )
	{
        if( indegree[i] == 0 )
		{
			vert = i;
			return true;
		}
	}
	return false;
}

void topSort()
{
   stack<int> myStack; //定义堆栈
    
   int node;
   if( findZeroIndegree(node) )
   {
           myStack.push(node);
   }
   else
   {
	   printf("无法排序!\n");
	   return ;
   }

   int count = 0;
   while ( !myStack.empty() )
   {  
	   count++;
	   node = myStack.top();
	   myStack.pop();
	   indegree[node] = -1; //标记该点已经访问过了
	   cout << node << endl;
       
	   //清除node发出的所有边
	   for ( int index = head[node]; index != -1; index = e[index].next )
	   {
              int to = e[index].to;
			  indegree[to]--;
	   }


       if( findZeroIndegree(node) )
		   myStack.push(node);

   }

   if( count != v )
	   cout << "无法排序" << endl;
   
}

int main()
{
	int n; //边数
	printf("请输入边的数目:");
	scanf("%d%d",&v,&n);
	memset(head,-1,sizeof(head));
	memset(indegree,0,sizeof(indegree));
	int from,to;
	for ( int i = 0; i < n; i++ )
	{
               scanf("%d %d",&from,&to);
		addEdge(from,to);
		indegree[to]++;
	}

	topSort();
	return 0;
}

 

分享到:
评论

相关推荐

    图论- AOV 网与拓扑排序.rar

    本资料"图论- AOV 网与拓扑排序.rar"聚焦于图论中的两个关键概念:AOV(Activity On Vertex,顶点上的活动)网络和拓扑排序。 AOV 网络,通常用于项目管理或任务调度,是图论中的一种特殊类型,它表示一系列有先决...

    拓扑排序------打印输出计算机本科专业4年每学期的课表

    拓扑排序是图论中的一个重要概念,特别是在有向无环图(DAG,Directed Acyclic Graph)中。在这个场景中,计算机本科专业的四年课程安排可以被看作是一个有向图,其中每个节点代表一门课程,箭头则表示课程之间的先...

    图论- 竞赛图.rar

    5. 拓扑排序:对有向无环图进行线性排序,使得对于每条有向边 (u, v),u 总是在 v 之前。这在比赛中可用来安排比赛顺序或确定晋级序列。 6. 顶点色数:给图的每个顶点涂上颜色,要求相邻的顶点颜色不同,最少需要的...

    图论- DAG 图的最长路.rar

    总之,DAG中的最长路径问题是一个典型的图论问题,解决这个问题需要理解图的基本概念,掌握拓扑排序、动态规划等算法,并能够根据实际情况选择合适的解决方案。通过深入学习和实践,我们可以有效地解决这类问题并在...

    图论- 生成树- 最小瓶颈生成树.rar

    换句话说,生成树是原图的一个拓扑排序结果,它可以保证任何两个节点之间存在唯一路径。 接着,我们来讨论最小生成树的概念。在一个带权重的无向图中,最小生成树是指从所有可能的生成树中选择出一个,其所有边的...

    图论- 图的搜索.rar

    2. **拓扑排序**:对于无环有向图(DAG),BFS可以用来进行拓扑排序,得到一个节点的线性顺序,使得对于每条有向边 (u, v),u 在排序后的序列中都出现在 v 之前。 3. **最短路径问题**:BFS可以解决带权重的图中两...

    拓扑排序 ---排课表----数据结构

    在数据结构领域,拓扑排序是一种重要的图论算法,它主要应用于有向无环图(DAG,Directed Acyclic Graph)。拓扑排序是将这样的图中的所有节点进行线性排序,使得对于每一条从节点u到节点v的有向边,u都在v之前。这...

    图论- 2-SAT 问题.rar

    反之,如果不存在这样的回路,可以通过拓扑排序确定一个变量的赋值顺序,从而得出所有公式都能满足的解。 在实际应用中,2-SAT问题广泛用于逻辑推理、电路设计、规划问题和人工智能等领域。例如,在电路设计中,2-...

    图论- 网络流- 最大流- SAP 算法与 ISAP 算法.rar

    2. 从源点出发,使用拓扑排序找到一条增广路径,即路径上所有边的残量之和大于0的路径。 3. 沿着增广路径更新边的流量和残量,增加的流量等于路径上最小的残量。 4. 重复步骤2和3,直到找不到增广路径为止。 ISAP算...

    图论- 环与块- DAG 图判定.rar

    4. **拓扑排序**:DAG图可以进行拓扑排序,得到一个节点的线性排列,使得对于每条有向边uv,u都在v之前。 总的来说,图论中的环与块以及DAG图判定是理解和解决复杂问题的基础工具。无论是理论研究还是实际应用,...

    图论- 图的连通性- Kosaraju 算法.rar

    图论是计算机科学中的一个...同时,它可能还会探讨与Kosaraju算法相关的其他图论概念,比如弱连通分量、拓扑排序等,以增强你的理论基础。学习并掌握Kosaraju算法,对于提升你的图论知识和解决相关问题的能力大有裨益。

    拓扑排序-数据结构-图

    图的拓扑排序是数据结构领域中图论的一部分,它主要应用于有向无环图(DAG,Directed Acyclic Graph)。在这样的图中,拓扑排序是对所有节点的一种线性排列,使得对于每一条有向边 (u, v),节点 u 在排列中都出现在...

    图论- 图的遍历.rar

    - 在图的着色问题、连通性判断、有向无环图(DAG)的拓扑排序等问题中,遍历算法也发挥着重要作用。 4. 图的表示 在编程中,图可以使用邻接矩阵或邻接表来表示。邻接矩阵是一个二维数组,其中的元素表示顶点之间的...

    图论- DAG 的覆盖与独立集.rar

    DAG 的特性包括可达性、拓扑排序等,其中拓扑排序是将 DAG 的顶点排成线性序列,使得对于每条有向边 (u, v),顶点 u 总是在顶点 v 之前。 2. 覆盖与独立集的概念 - 覆盖:在图论中,覆盖是指选取图中的一部分顶点,...

    图论- 二分图- 二分图判定.rar

    3. **Kosaraju-Sharir算法**:该算法首先求出图的强连通分量,然后对每个强连通分量进行拓扑排序。如果每个分量的拓扑排序结果形成一个二分序列,那么图是二分图。 4. **Bipartite Checking矩阵**:可以将图的邻接...

    数据结构 图论 拓扑排序

    拓扑排序则是图论中一个实用且基础的概念,它主要用于有向无环图(DAG,Directed Acyclic Graph)的排序问题。在本实验代码中,我们将深入探讨拓扑排序的原理、实现方法及其应用。 拓扑排序是对有向无环图的顶点...

    图论- AOE 网与关键路径.rar

    1. **拓扑排序**:通过深度优先搜索(DFS)或广度优先搜索(BFS)对AOE网进行拓扑排序,确定活动的执行顺序。 2. **最早开始时间(ES)和最晚结束时间(LF)**:自始点开始,沿着有向边传播,计算每个活动的最早开始...

    图-Floyed算法-Dijkstra算法-拓扑排序算法(VC++程序)

    总的来说,Floyd算法、Dijkstra算法和拓扑排序算法是图论中的基础且实用的工具,它们在解决实际问题时具有广泛的应用。熟练掌握这些算法,不仅能够提升编程技能,还能为解决复杂问题提供有力的理论支持。

    简单拓扑排序——源码

    拓扑排序是图论中的一个重要概念,主要应用于有向无环图(DAG,Directed Acyclic Graph)。在这样的图中,节点之间的关系是有方向性的,而拓扑排序就是找到一个线性的顺序,使得对于每一条边 (u, v),节点 u 都在这...

    拓扑排序的演示

    拓扑排序是图论中的一个重要概念,特别是在有向无环图(DAG,Directed Acyclic Graph)中。在这个课程设计中,我们很可能涉及到如何通过编程实现拓扑排序的方法,这通常用于解决任务调度、依赖关系排序等问题。让...

Global site tag (gtag.js) - Google Analytics