有向图

有向图的强联通分量相关例题(Korasaju算法和Tarjan算法)

纵然是瞬间 提交于 2019-11-29 03:22:07
有向图的强联通分量相关例题(Korasaju算法和Tarjan算法) 一、 poj 2186:Popular Cows 即:强连通分量+缩点 还是很菜,都是照着大佬的板子敲的,而且还不是很熟练 Korasaju算法 实现 /**korasaju算法*/ # include <cstdio> # include <cstring> # include <algorithm> # include <iostream> # include <vector> using namespace std ; const int maxn = 10010 ; vector < int > edge1 [ maxn ] ; //原图的邻接表 vector < int > edge2 [ maxn ] ; //逆图的邻接表 int End [ maxn ] ; //对原图搜索,顶点的序号 int vis [ maxn ] ; int out [ maxn ] ; //转化为DAG以后的每个缩点的出度 int belong [ maxn ] ; //每个顶点属于哪个集合,相当于染色,当前结点被染成了什么颜色 int setNum [ maxn ] ; //每个颜色包括多少顶点,也就是强联通分量的个数 int color ; //代表不同的颜色 int cnt ; //正向排序的编号 int n , m

acwing 848 有向图的拓扑序列

老子叫甜甜 提交于 2019-11-28 18:07:31
地址 https://www.acwing.com/problem/content/description/850/ 题目描述 给定一个n个点m条边的有向图,图中可能存在重边和自环。 请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出-1。 若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。 输入格式 第一行包含两个整数n和m 接下来m行,每行包含两个整数x和y,表示点x和点y之间存在一条有向边(x, y)。 输出格式 共一行,如果存在拓扑序列,则输出拓扑序列。 否则输出-1。 数据范围 1≤n,m≤105 样例 输入样例: 3 3 1 2 2 3 1 3 输出样例: 1 2 3 算法1 拓扑排序流程为BFS 流程如下 1 首先找到第一个入度为0 的点 放入待处理队列,记录答案拓扑数组中 拓扑的必要条件 2 然后从该点连接的各个点 做以下操作: 2.1 删除该边后,查看从该点连接的的点的入度 2.2 如果入度为0 那么该点放入待处理队列,记录答案拓扑数组中, 再次进行BFS 直到待处理队列为空 C++ 代码 #include <iostream> #include <iostream> #include <vector> #include <queue> using namespace std; int

BFS和DFS分别用于有向图和无向图的一点心得和总结

本秂侑毒 提交于 2019-11-28 13:20:03
图的数据结构为邻接链表adjacency list。 listVertex是一个储存Vertex* 顶点类指针的vector类型的STL;在Vertex类中有一个类成员nextEdgeNode,他是储存pair<int,int>类型的vector容器;数对pair的first表示边指向的顶点序号,second表示边的序号。 四个函数都只有一个参数,在声明时提供了默认的参数值-1;参数表示起始顶点的编号 先放一个测试用的图、有向图的邻接链表、无向图的邻接链表。 以下是 有向图的BFS 1 void Graph::BFSListO(int startFrom) { 2 /*the principle is to firstly choose a random vertex, if it has 0 out degree, then choose the first 3 unvisited vertex in the list; moreover,if one way is exhausted to continue,also push the first univisited vertex 4 in the list to the queue*/ 5 cout << "BFS of oriented Adjacey List:" << endl; 6 srand((unsigned

半世苍凉 提交于 2019-11-27 18:48:32
图分为,有向图、无向图 设顶点(vertex)的个数为n,有n(n-1)/2 条边(edge)的无向图,称为完全图;有n(n-1) 条弧的有向图,称为有向完全图。 来源: https://www.cnblogs.com/GoldenEllipsis/p/11372965.html

图的概念与五种结构实现 (详细定义与源码实现)

不想你离开。 提交于 2019-11-27 15:49:27
,图的术语多的让人绝望,但我们要沉下心来慢慢琢磨透它. 首先我们来看一下图的定义: 图是由顶点的有穷非空集合和顶点之间边的集合组成, 通常表示为: G (V,E) ,其中,G表示为一个图,V是图G中顶点的集合 E是图G中边的集合. 其次,我们知道线性表中数据元素叫元素,树中将数据元素叫结点,而图中数据元素 我们则称之为顶点.线性表中可以没有数据,称为空表.树中没有结点,叫做空树.而对于图来说,则强调了顶点集合V有穷非空.但边集可以为空. 接下来我们来认识一些图的种类: 无向边: 若定点Vi到Vj之间没有方向,则称这条边为无向边,用无序偶对(Vi,Vj)来表示. 无向图: 若图中任意两个顶点之间的边都是无方边,则称改图为无向图. 无向完全图: 在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图. 有向边: 若从顶点Vi到Vj的边有方向,则称这条边为有向边,也称为弧.用有序偶对<Vi,Vj>来表示,Vi表示弧尾,Vj表示弧头. 有向图: 若图中任意两个顶点之间的边都是有向边,则称该图为有向图. 有向完全图: 在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称为有向完全图. 简单图: 在图中,若不存在顶点到其自身的边,且同一条边不重复出现,这样的图为简单图. 稀疏图: 图中边或弧很少 稠密图: 图中边或弧很多. 权: 与图的边或弧相关的数叫做权 网:

20182310第十周学习总结

这一生的挚爱 提交于 2019-11-27 12:12:20
20182310 2019-2020-1 《数据结构与面向对象程序设计》第十周学习总结 教材学习内容总结 本周主要学习无向图、有向图、带权图、常用的图算法、图的实现策略。 1.与树类似,图由结点和这些结点之间的连接构成。 顶点(vertice)就是这些结点。 边(edge)就是这些结点连接起来的线段。 路径(path):图中的一系列边,每条边连通两个顶点。 路径的长度(length):是该路径中边的条数(或者是顶点数减去1)。 环路(cycle):一种首结点和末结点相同且没有重边的路径。没有环路的图称为无环的(acyclic)。 完全图(complete graph):含有最多条边的无向图 对有n个结点的无向图,要使该图是完全的,要求有n(n-1)/ 2个边。 对有n个结点的有向图,要使该图是完全的,要求有n(n-1)个边。 2.无向图是一种边为无序结点对的图。 无序结点(undirected vertice):A、B、C、D 边(edge)(注:由于无序,所以<a,b>和<b,a>一样):(A,B) (B,D) (A,D) (B,C) (C,D) 邻接(adjacent):如果图中两个顶点之间有一条连通边,则称这两个顶点是邻接的。如图,A和B邻接,A和C不邻接。 自循环(self-loop)或环(sling):连通一个顶点及其自身的边称为自循环,如图,边(A,A

Tarjan算法求有向图强连通分量并缩点

非 Y 不嫁゛ 提交于 2019-11-27 05:40:20
// Tarjan算法求有向图强连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; const int N = 100010, M = 1000010; // int ver[M], Next[M], head[N], dfn[N], low[N]; int stack[N], ins[N], c[N]; int vc[M], nc[M], hc[N], tc; //强连通分量 vector<int> scc[N]; int n, m, tot, num, top, cnt; void add(int x, int y) { ver[++tot] = y, Next[tot] = head[x], head[x] = tot; } //缩点后建图 void add_c(int x, int y) { vc[++tc] = y, nc[tc] = hc[x], hc[x] = tc; } void tarjan(int x) { dfn[x] = low[x] = ++num; stack[++top] = x, ins[x] = 1;//标记x点 for (int

常用算法大全-贪婪算法

安稳与你 提交于 2019-11-27 02:54:00
本章首先引入最优化的概念,然后介绍一种直观的问题求解方法:贪婪算法。最后,应用该算法给出货箱装船问题、背包问题、拓扑排序问题、二分覆盖问题、最短路径问题、最小代价生成树等问题的求解方案。 1.1 最优化问题 本章及后续章节中的许多例子都是最优化问题( optimization problem),每个最优化问题都包含一组限制条件( c o n s t r a i n t)和一个优化函数( optimization function),符合限制条件的问题求解方案称为可行解( feasible solution),使优化函数取得最佳值的可行解称为最优解(optimal solution)。 例1-1 [ 渴婴问题] 有一个非常渴的、聪明的小婴儿,她可能得到的东西包括一杯水、一桶牛奶、多罐不同种类的果汁、许多不同的装在瓶子或罐子中的苏打水,即婴儿可得到n 种不同的饮料。根据以前关于这n 种饮料的不同体验,此婴儿知道这其中某些饮料更合自己的胃口,因此,婴儿采取如下方法为每一种饮料赋予一个满意度值:饮用1盎司第i 种饮料,对它作出相对评价,将一个数值si 作为满意度赋予第i 种饮料。 通常,这个婴儿都会尽量饮用具有最大满意度值的饮料来最大限度地满足她解渴的需要,但是不幸的是:具有最大满意度值的饮料有时并没有足够的量来满足此婴儿解渴的需要。设ai是第i 种饮料的总量(以盎司为单位)

概率图模型

大憨熊 提交于 2019-11-26 14:13:10
1.概率图模型 概率图模型是一类用图形模式表达基于概率相关关系的模型的总称。 有向图 无向图 2.HMM HMM是动态贝叶斯网,是一种有向图模型,主要用于时序数据建模。 yi是状态变量,也称为隐变量,xi是观测变量。 3.MRF MRF是马尔可夫网,是无向图模型。 4.CRF CRF是一种无判别式无向图模型。 来源: https://blog.csdn.net/weixin_43989326/article/details/98884122

大话数据结构读书笔记系列(七)图

妖精的绣舞 提交于 2019-11-26 11:58:43
7.1 开场白 旅游几乎是每个年轻人的爱好,但没有钱或没时间也是困惑年轻人不能圆梦的直接原因。如果可以用最少的资金和最少的时间周游中国甚至是世界一定是非常棒的。假设你已经有了一笔不算很丰裕的闲钱,也有了约半年的时间。此时打算全国性的旅游,你将会如何安排这次行程呢? 我们假设旅游就是逐个省市进行,省市内的风景区不去细分,例如北京玩7天,天津玩3天,四川玩20天这样子。你现在需要做的就是制订一个规划方案,如何才能用最少的成本将图7-1-1中的所有省市都玩遍,这里所谓最少的成本是指交通成本与时间成本。 如果你不善于规划,很有可能就会出现如玩好新疆后到海南,然后再冲向黑龙江这样的荒唐决策。但是即使是紧挨着省市游完的方案也会存在很复杂的选择问题,比如游完湖北,周边有安徽,江西,湖南,重庆,陕西,河南等省市,你下一步怎么走最划算呢? 你一时解答不了这些问题是很正常的,计算的工作本来就非人脑应该是电脑去做的事情。我们今天要开始学习最有意思的一种数据结构--图。在图的应用中,就有相应的算法来解决这样的问题。学完这一章,即便不能马上获得最终答案,你也大概知道应该如何去做了。 7.2 图的定义 在线性表中,数据元素之间是被串起来的,仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继。在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素相关