ACM 图论入门

①图论基础

图由点和边组成

记顶点集合为V 边集合为E的图为G=(V,E)

图可分为有向图和无向图。如表示朋友关系的图为无向图,表示点之间大小关系的图为有向图。

边也可以带有权值,带有权值称为有权图,不带有权值称为 无权图。

一.关于无向图

任意两点之间都有路径的图叫做连通图,顶点连接的边数称为这个点的度。

没有环的连通图就是树,没有环的非连通图就是森林。

一棵树的边数=顶点数-1。反之
边数=顶点数-1的连通图就是树。

二.关于有向图

以一个点为起点的边数称作这个点的出度,以一个点为终点的边数称作这个点的入度。

有向无环图叫做DAG(Directed Acyclic Graph).

DAG中有一种有趣的点的编号方式:如果把点编号 使边只从编号小的点指向编号大的点 那么这种编号称为拓扑序。求解拓扑序的算法叫做拓扑排序。

有了拓扑排序,很多DAG的问题就可以用DP来解决啦。

②图的表示

研究图的问题首先要把图用具体的数据结构储存起来。

假设顶点编号为1-V 那么一般有两种图的表示方法:邻接矩阵和邻接表

一.关于邻接矩阵

邻接矩阵就是用一个V*V的二阶矩阵来保存边 [i][j]即表示i对j的关系.

在无权图中可以用 矩阵[i][j]=1 来表示i对j有一条边(在无向图中同样有矩阵[j][i]=1) 用矩阵[i][j] = 0 来表示i对j没有边。

在有权图中矩阵[i][j] = i对j的边的权值 。  如果i对j没有边 不能用=0来表示(这样就分不清权值为0的边了) 而要用INF来表示。

使用邻接矩阵的好处是可以在O(1)的时间内判断两点间的关系 但需要花费O(V^2)的空间来储存它。V很大时,这种方法不再适用。

在图中有重边或者自环的情况下,要具体分析取舍。

二.邻接表

邻接表是通过真正的储存点和边来实现的,所以其空间只需要O(E+V),但相应的时间复杂度要高。可以使用vector不定长数组来实现图的储存(push_back意为在vector尾部加入一个数据)  每个点都有一个vector数组,里面存着它连向的边。

vector<int> G[MAX_V];
/*
 *   若边上有属性
 *   则 struct edge(int to,cost;);
 *   vector<edge> G[MAX_V];
 */
//假如有一条从s连向t的边
G[s] = push_back(t);//如果是无向图 反过来还有 G[t] = push_back(s);
//下面是查询s是否有一条连向t的边
int len = G[s].size();
for(int i = 0 ; i < len ; i ++) {
    if(G[s][i] == t) {
        printf("Yes\n");
        break;
    }
    if(i == len-1) printf("No\n");
}
时间: 2024-12-22 13:14:11

ACM 图论入门的相关文章

&lt;图论入门&gt;邻接矩阵+邻接表

非本人允许请勿转载. 趁热打铁,学会了邻接表把这个总结一下,以及感谢大佬uncle-lu!!!(奶一波)祝早日进队! 首先,图论入门就得是非常基础的东西,先考虑怎么把这个图读进去. 给定一个无向图,如下 怎么把这个图的数据读入进去呢? 把这个图剖析开来看,1连着的是2和3,2连着4和5,3连着6和7,4连着5,5连着8和6,6连着9. 所以这个图可以用一种神奇的东西----邻接矩阵来存.如下,能联通的制为1,不能联通的制为0. 那么可以看出来,这个邻接矩阵光读入的时间复杂度就是O(N2)的了,在

ACM图论—最小环问题 ( 仔细分析+理解+代码 )(HDU 1599 ) (POJ 1743)

说明:如果发现错误或者有任何问题,任何不理解的地方请评论提出,或私信me,^ _ ^ ACM-图论 最小环问题(Floyd算法应用) 最小环问题是Floyd算法的应用,并不难,和Floyd算法一样难度.但是如果要输出最小环路径就要稍微麻烦一点,也不难. 1.计算最小环值(HDU 1599) 有向图最小环: 有向图最小环最少要有2个点组成环,这个的写法就是用Floyd()求最短距离,最后所有点中的最短距离的最小值就是答案. 无向图最小环: 肯定和有向环做法有区别,无向图构成环最少要有3个点,所以求

图论入门-Kruskal算法

1943: 最优布线问题 Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: 33  Accepted: 19[Submit][Status][Web Board] Description 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来.两台计算机被连接是指它们间有数据线连接.由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的. 当然,如果将任意两台计算机都用数据线连

图论入门算法理解

1.Dijsktra 算法 Dijsktra算法是基于贪心的,从源点开始扩展,将当前已经是最短路的点加入集合中.dist[i]表示源点s到i的距离,那么初始的时候,找距离源点最近的一个点t0,那么dist[t0]必定是s到t0最短的距离,因为不可能通过其他的点转到t0再让t0最短了(这也是为什么Dijsktra不能处理负权边的原因),同理,扩展第二点的时候也是一样,因为 在扩展第二个点的时候,已经用 第一个点 优化了所有其他的点,那么最近的那个点,一定无法 通过剩余的其他的那个点来 优化自己的距

洛谷图论入门题--基本题必做 图-最短路径-1.信使(msner)

1 //带病打代码的我,心好累,脑子更累. 看到此代码的请给点个赞 ,谢谢. 2 //这个题还是比较简单的,用弗洛伊德完全就能过: 3 /*由衷的感谢江山,帮忙看程序的错误 , 4 5 ,--^----------,--------,-----,-------^--, 6 | ||||||||| `--------' | O 7 `+---------------------------^----------| 8 `\_,-------, _________________________|

图论入门小结

1.传递闭包 和弗洛伊德一样的三个循环...不过从三角形松弛变成了判断两个点是否都有一条到某一个中间节点的路径,若有则两点联通. 复杂度n^3 2.弗洛伊德 任意两点间最短路 三角形性质 dis[x]+len[x][y]>=dis[y];//某一点到x的距离+x与y之间的距离>=该点到y的距离 松弛就是把不满足上述要求的最短距离改为满足的... 复杂度n^3 三个循环,中间节点放最外面 1 for(){// k的循环 2 for(){// i的循环 3 for(){// j的循环 4 if(d

ACM(图论)——tarjan算法详解

---恢复内容开始--- tarjan算法介绍: 一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法.通过变形,其亦可以求解无向图问题 桥: 割点: 连通分量: 适用问题: 求解(有向图/无向图)的,桥,割点,环,回路等问题 整体思想: 如果我们欲要求解,桥的个数,割点的个数,环的数目,归根结底,是分析清楚一个图 有几个 环,每个环包含哪些节点,那些边. 而 tarjan算法就是做的这件事情,通过dfs遍历每一条边和节点,算出有几个环,每个环中有哪些节点.那么是如何做的呢

图论的小总结

图论是一个很大的范围,如果要学精的话肯定是深度钻研以及学习更多的高级算法,高级数据结构等.因为我也学习了图论的入门了,所以想要总结一下图论入门的知识,如果有什么不对或不完整的部分希望各位大神帮我指出,谢谢. 这篇随笔就只写一下图的最短路和最小生成树以及一些基础的知识. 一.图的定义:由顶点集合V和一个顶点间关系的集合也就是边的集合E组成的,记做G=(V,E). 二.图可以根据边的特性分为两种,有向图和无向图. 无向图:如果两个点a,b,在满足(a,b)∈E的同时也一定满足(b,a)∈E,则称这图

使用阿里云ACM简化你的Spring Cloud微服务环境配置管理

摘要: 本文我们就如何使用阿里云ACM这样的配置管理产品在Spring Cloud中替代Spring Cloud Config帮助简化环境配置管理做一个简单的示例,帮助你理解基于ACM来简化微服务环境配置管理的方案,并会简单比较一下ACM与Spring Cloud Config方案的优劣. 配置的环境属性 毫无疑问,在系统持续交付的过程中,系统最终运行环境的多样性及复杂性毫无疑问增加了我们在配置管理工作上的负担,有时候,甚至不夸张的说,配置就是因环境而生. 这在Eugen Paraschiv的博