有向图

AcWing 848. 有向图的拓扑序列

倖福魔咒の 提交于 2020-02-06 01:18:12
给定一个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 难度: 简单 时/空限制: 1s / 64MB # include <iostream> # include <cstdio> # include <cstring> # include <algorithm> using namespace std ; const int N = 100010 ; int n , m ; int h [ N ] , ne [ N ] , e [ N ] , idx ; int q [ N ] , d [ N ] ; void add ( int a , int b ) { e [ idx ] = b , ne [ idx ] = h [ a ] , h [ a ] = idx ++ ; } bool topsort ( )

数据结构课设——有向图的深度、广度优先遍历及拓扑排序

吃可爱长大的小学妹 提交于 2020-01-30 22:19:33
任务:给定一个有向图,实现图的深度优先, 广度优先遍历算法,拓扑有序序列,并输出相关结果。 功能要求:输入图的基本信息,并建立图存储结构(有相应提示),输出遍历序列,然后进行拓扑排序,并测试该图是否为有向无环图,并输出拓扑序列。 按照惯例,先上代码,注释超详细: #include<stdio.h> #include<stdlib.h> #include<malloc.h> #pragma warning(disable:4996) #define Max 20//定义数组元素最大个数(顶点最大个数) typedef struct node//边表结点 { int adjvex;//该边所指向结点对应的下标 struct node* next;//该边所指向下一个结点的指针 }eNode; typedef struct headnode//顶点表结点 { int in;//顶点入度 char vertex;//顶点数据 eNode* firstedge;//指向第一条边的指针,边表头指针 }hNode; typedef struct//邻接表(图) { hNode adjlist[Max];//以数组的形式存储 int n, e;//顶点数,边数 }linkG; //以邻接表的存储结构创建图 linkG* creat(linkG* g) { int i, k; eNode* s;/

欧拉回路、欧拉通路、欧拉图、半欧拉图等有关欧拉图的讲解与代码实现

白昼怎懂夜的黑 提交于 2020-01-30 20:05:51
有人说,图论的起源,就是源于欧拉图 (千万别看成柏拉图) ——题记 首先,先要讲一些有必要知道的东西: 当然,我在这里也写过,这里再给出一些拓展的内容 欧拉通路 : 通过图中每条边且只通过一次,并且经过每一顶点的通路 欧拉回路 : 通过图中每条边且只通过一次,并且经过每一顶点的回路 有向图的基图:忽略有向图所有边的方向,得到的无向图称为该有向图的基图。 欧拉图与半欧拉图 : 欧拉图指的是给出的图G<V, E>,满足所有的点V联通,并且每个点的度都是偶数,则图中的所有的边都可以一笔画经过,并且回到起始点,则我们说给出的图G是欧拉图; 半欧拉图的性质与欧拉图相似,但是它可以首尾不相连接,也就是这幅图是欧拉通路,满足图中的所有的边都可以一笔画经过,但是不要求回归起点。 无向图的欧拉图判定与有向图的欧拉图判定 无向图 设G是连通无向图,则称经过G的每条边一次并且仅一次的路径为欧拉通路; 如果欧拉通路是回路(起点和终点是同一个顶点),则称此回路是欧拉回路 具有欧拉回路的无向图G成为欧拉图 有向图 (1)设D是有向图,D的基图连通,则称经过D的每条边一次并且仅有一次的有向路径为 有向欧拉通路 (2)如果有向欧拉通路是有向回路,则称此有向回路为 有向欧拉回路 (3)具有有向欧拉回路的图D称为有向欧拉图 定理(无向图) 无向图G存在欧拉通路的充要条件是:G为连通图,并且G仅有两个奇度结点

[ACW]893集合-Nim游戏

喜欢而已 提交于 2020-01-27 15:08:45
题链 tips:   1.对于简单的Nim游戏,a1^...an;ai就是sg函数值。   2.一堆石子就是一个有向图;可以按条件转移局面。   3.sg函数的定义有递归的味道,所以用记忆化搜索来写。   5.sg(x)=k,则局面x可以转移到0~k-1。   4. puts输出字符串会自动换行 //sg函数的定义本身就有递归的感觉,一直到递归基 #include<bits/stdc++.h> #include<iostream> #include<set> using namespace std; int n,m; const int N=110,M=10010; int s[N],F[M]; int sg(int x){ if(F[x]!=-1) return F[x]; //用哈希表存所有可以到的局面 unordered_set<int > S; for(int i=0; i<n; i++){ if(x >= s[i]) S.insert(sg(x-s[i])); } for(int i=0;;i++){ if(!S.count(i)) return F[x]=i; } } int main(){ cin>>n; for(int i=0; i<n; i++){ cin>>s[i]; } cin>>m; memset(F , -1, sizeof(F)); int res=0;

015查找有向图中的强连通分量

醉酒当歌 提交于 2020-01-26 22:52:02
查找有向图中的强连通分量 图学习笔记索引 本文参考《算法(第4版)》 1.实现代码 2.总结 图学习笔记索引 001自定义输入流In类实现 002背包数据类型Bag实现 003无向图数据类型实现 004基于图的深度优先搜索 005使用深度优先搜索找图中的所有连通分量 005-1基于深度优先搜索查找图中连通路径 006基于深度优先搜索判断图中是否存在环 007基于深度优先搜索判断一个无向图图是否是一个二分图 008广度优先搜索查找连通图中的最短路径 009有向图数据类型实现 010有向图的可达性 011带权重的无向边数据类型Edge实现 012加权无向图数据类型实现 013寻找有向环 014有向图中基于深度优先搜索的顶点排序 本文参考《算法(第4版)》 1.实现代码 点击文字获取:001自定义输入流In类实现 从文件中读取图的顶点关系。 tinyDG.txt中的内容: 13 22 4 2 2 3 3 2 6 0 0 1 2 0 11 12 12 9 9 10 9 11 8 9 10 12 11 4 4 3 3 5 7 8 8 7 5 4 0 5 6 4 6 9 7 6 Java代码: package algorithms.graph; import java.io.IOException; public class KosarajuSCC { private boolean

DFS及有向图的拓扑排序

痴心易碎 提交于 2020-01-16 14:59:50
一个有向图的DFS森林可能具有的全部类型的边: 树向边、回边、从顶点到树中非子女子孙的前向边、交叉边。所有不属于前三种类型的边都属于交叉边。 一条回边的存在意味着有向图具有一个有向的回路。如果一个有向图的DFS森林没有回边,该有向图是一个无环有向图,即有向无环图的简称。 拓扑排序: 按某种次序列出有向图中的顶点,使得对于图中每一条边来说,边的起始顶点总是排在边的结束顶点之前。这个问题称为拜年排序。 拓扑排序的两个算法: 1,DFS。 执行一次DFS遍历,并记住顶点变成死端(即退出遍历栈)的顺序。将该顺序反过来就得到了拓扑排序的一个解。当然,在遍历的时候不能遇到回边。如果遇到一条回边,该图就不是无环有向图,并且对它顶点的拓扑排序是不可能的。 2,基于减治法: 不断地做这样的一件事,在余下的有向图中求出一个源,它是一个没有输入边的顶点,然后把它和所有从它出发的边都删除。如果有多个这样的源,可以任意选择一个。如果这样的源不存在,算法停止,因为该问题是无解的。 来源: https://www.cnblogs.com/cmleung/archive/2011/04/26/2028872.html

20182311 2019-2020-1 《数据结构与面向对象程序设计》实验九报告

旧街凉风 提交于 2019-12-22 07:59:16
20182311 2019-2020-1 《数据结构与面向对象程序设计》实验九报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 冷冲 学号:20182311 实验教师:王志强 实验日期:2019年12月7日 必修/选修: 必修 1.实验内容 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出 完成有向图的单源最短路径求解(迪杰斯特拉算法) 2. 实验过程及结果 (一)初始化:基于邻接矩阵构建有向图和无向图 import java.util.*; public class Graph { private int[][] matrix;//邻接矩阵 private char[] vexs;//顶点数组 private int vexnum;//节点数 private int arcnum;//边数 private int[] isVisited;//0表示未被访问。1表示访问过 private Queue list; public Graph

最短路径:单源最短路径与差分约束系统

核能气质少年 提交于 2019-12-15 17:51:59
学习自《算法导论》和Wiki 无权/权=1:BFS ——O(V+E) 有向图(非负边):Dijkstra——O(E+VlgV) 有向图(无环):Dijkstra——O(V+E) 一般(可正可负可环):Bellman-Ford———O(VE) 优化:SPFA 一丶BFS BFS ( G , s ) { //初始化 foreach ( v∈G . V ) { v . visit = 0 ; u . d = NIF ; u . path = nil } s . d = 0 ; s . path = nil ; s . visit = 1 ; //根节点进队 enqueue ( Q , s ) while ( Q not empty ) { u = dequeue ( Q ) foreach ( v∈Adj [ u ] ) if ( visit [ v ] == 0 ) { d . v = d . u + 1 ; v . path = u ; v . visit = 1 ; enqueue ( Q , v ) ; } } 复杂度分析 1.初始化成本O(V) 2.队列操作总时间为O(V) 3.每个结点进队和出队一次,只有出队时候才进行扫描,每个邻接链表最多扫描一次,所以用于扫描邻接表的总时间为O(E) 所以O(V+E) 松弛操作 每个结点v来说,我们维持一个属性v.d

图的基本概念详解

社会主义新天地 提交于 2019-12-11 22:34:00
一、前言 从今天开始就给大家分享有关于图的概念和代码啦,不知道大家有没有看够树的相关内容呢?以后还会慢慢给大家再分享的,代码要一遍一遍过,一轮一轮学习。第一轮树就先到这里,等第二轮还会给大家分享的。 图应该是数据结构中处于霸王地位的一部分了,图会涉及到图论的相关知识,咱们现在还涉及不到,等到以后分享数学基础,讲离散数学的时候,会给大家分享有关图论的内容。 为什么称图是霸王地位呢?因为图应该是数据结构中最难的: 1.图状结构是我们研究的结构里面最复杂的结构 我们在讲解数据的逻辑结构时给大家讲到数据结构有如下四个:集合,线性结构,树形结构,图状结构或网状结构。集合只有同属于一个集合;线性结构存在一对一的关系;树形结构存在一对多的关系;图状结构存在多对多的关系。 2.图的相关关系非常复杂,相关概念非常多 图有有向图,有无向图;有简单图,有多重图;有连通图,非连通图等等等等。如果把图画出来,我们人去看一个图比较简单,我们会有各种各样去分析这个图的方法,计算机不同,他们没有人这么强大的大脑,很多对于图的分析很死板,需要我们把图分析好了再做处理(如果人工智能发展比较好的话,这个问题可能会解决)。 但是图又很重要,不管是地图,人物关系等,把每个人或者每个地方看作一个点,其他的点都会与之有上千万的联系。所有就都有及其复杂的网络,不管是路径规划,导航提醒还是警察在断案,其实本质上都是图的应用。 所以

20182311 2019-2020-1 《数据结构与面向对象程序设计》实验九报告

倾然丶 夕夏残阳落幕 提交于 2019-12-07 23:13:29
20182311 2019-2020-1 《数据结构与面向对象程序设计》实验九报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 冷冲 学号:20182311 实验教师:王志强 实验日期:2019年12月7日 必修/选修: 必修 1.实验内容 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出 完成有向图的单源最短路径求解(迪杰斯特拉算法) 2. 实验过程及结果 (一)初始化:基于邻接矩阵构建有向图和无向图 import java.util.*; public class Graph { private int[][] matrix;//邻接矩阵 private char[] vexs;//顶点数组 private int vexnum;//节点数 private int arcnum;//边数 private int[] isVisited;//0表示未被访问。1表示访问过 private Queue list; public Graph