栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

图论基础&拓扑排序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

图论基础&拓扑排序

1.图的存储

图的BFS遍历

 

2.欧拉图

(即能不重复得走完所有边且起点和终点相同的为欧拉图,只能不重复走完所有边但不能回到起点的是半欧拉图)

3.拓扑排序 1)概念引入

一个工程常被分为多个小的子工程,这些子工程被称为活动(Activity),在有向图中若以顶点表示活动,有向边表示活动之间的先后关系,这样的·图简称为AOV网。在AOV网中为了更好地完成工程,必须满足活动之间先后关系,需要将各活动排一个先后次序即为拓扑排序。

(其实这个在我们生活中很常见啦,比如学校要排一个课表,规定必须要先上完高数再上线性代数,要先上完C语言再上数据结构......)

2)解法

只要每次去找入度为0的点(符合执行条件),取出它作为答案并将其删除,同时删除它到其它顶点的边,再重复此过程,直到顶点全部删完或是没有办法删除结点了(存在环,无解)

可以看出拓扑排序是有多解的

 3)代码
#include
#include
using namespace std;
const int M=1e6+6;
int n,m,head[M],ct,ind[M],ans[M];
queue q;
struct ED{
	int t,next;
}e[M];
void addedge(int u,int v){
	e[++ct].t=v;
	e[ct].next=head[u];
	head[u]=ct;
}
void tuopu(){
	int t=0;
	for(int i=1;i<=n;i++){
		if(!ind[i])q.push(i);
	}
	while(!q.empty()){
		int x=q.front();
		ans[t++]=x;
		//cout <<"t="<>n";
			//cout <<"e[i].t="<"<n>>m;
	for(int i=1;i<=n;i++)head[i]=-1;
	int x,y;
	for(int i=0;i>x>>y;
		addedge(x,y);
		ind[y]++;
	}
	tuopu(); 
	return 0;
}

//因为每个点每条边都只访问了一次所以复杂度是O(n+m) 

为了便于理解其过程,把中间变量打印了一些

AOE网 关键路径

  

 

 做法:从左往右按照拓扑的方法求出每个结点的最早开始时间,再从右往左,逆推出每个结点开始的最晚时间,如果最早时间==最晚时间,就是关键的路径上的点。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/846639.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号