首页 > 其他分享 >图论笔记

图论笔记

时间:2023-04-22 11:00:09浏览次数:37  
标签:图论 ch int 短路 笔记 无向 仙人掌 dis

图的概念

图:点--边

度->有向图(入度,出度)|| 无向图(度)

自环:若一条边的两个顶点为同一顶点,则此边称作自环。

路径:从任何一个点出发,随意在图上走,走出来的序列叫路径。| 简单路径(一条路径,每个点最多只能走一次)


 

特殊的图

1)没有环的无向图:树-->无向,连通,无环   || n个点 n-1条边

只有无向无环:很多个树-->森林

只有连通无环(有向):(连通的DAG)/有向树

只有无向连通:。。。

2)有向图的树:外向树,内向树

外向:所有边的方向都是从根向外指

 内向:所有边的方向都是从外向根的方向指

 

3)树的扩展:章鱼图/基环树:环上每个点连出去的部分为一棵树 || n个点的章鱼图n条边

树变成章鱼图加一条边 || 章鱼图删掉环上一条边变成树

4)仙人掌图:边仙人掌,点仙人掌

边仙人掌:每条边最多在一个环上

点仙人掌:每个点最多在一个环上

点仙人掌一定是边仙人掌

5)DAG(Directed Acyclic Graph):有向无环图

6)二分图

无向图

所有的点划为左边一部分,右边一部分,保证图当中所有的边都是从左边的一个点连到右边的一个点

树一定是二分图


 

图的储存方法

邻接矩阵   ----------      边表

优点:O(1)检查  ||  O(m)的内存

缺点:内存大,重边只能记一条  ||  检查


 

最短路

单源最短路问题:求一点到所有点的最短路

多源最短路问题:求多点到所有点的最短路

最短路中的三角不等式:

dis[i][k]+dis[k][j]>=dis[i][j]

松弛操作

求最短路过程中

if  dis[i][k]+k->j(k到j的长度)<dis[i][j]
{
  dis[i][j]==dis[i][k]+k->j
}

 通过一条边来更新最短路的操作叫做松弛操作

最短路问题

1)Floyd

多源最短路算法

求任意连点之间的最短路

时间复杂度O(n3) || 空间复杂度O(n2)

处理范围n<=200~500

2)Dijkstra

单元最短路算法(前提:边权>=0)

求一个点到其他点的最短路

dis 1 2 3 4
初始化 0

 

(1-->1的最短路是0)

 

 

DJ堆优化

3)Dijkstra+Heap

4)Bellman-Ford

5)SPFA

 1 //By:Komorebi_03
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 #define int long long
 5 const int INF = 2147483647;
 6 const int N = 1e6+5;
 7 int n,m,s,e_cnt,dis[N],vis[N],head[N];
 8 struct node{
 9     int v;
10     int w;
11     int nxt;
12 }e[N];
13 inline int read()
14 {
15     int x=0,f=1;char ch=getchar();
16     while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
17     while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
18     return x*f;
19 }
20 
21 void add(int u,int v,int w)
22 {
23     e[++e_cnt].v=v;
24     e[e_cnt].w=w;
25     e[e_cnt].nxt=head[u];
26     head[u]=e_cnt;
27 }
28 
29 void SPFA()
30 {
31     queue<int> q;
32     for (int i=1;i<=n;i++)
33     {
34         dis[i]=INF;
35         vis[i]=0;
36     }
37     q.push(s);
38     dis[s]=0;
39     vis[s]=1;
40     while(!q.empty())
41     {
42         int u=q.front();
43         q.pop();
44         vis[u]=0;
45         for (int i=head[u];i;i=e[i].nxt)
46         {
47             int v=e[i].v;
48             if(dis[v]>dis[u]+e[i].w)
49             {
50                 dis[v]=dis[u]+e[i].w;
51                 if(vis[v]==0)
52                 {
53                     vis[v]=1;
54                     q.push(v);
55                 }
56             }
57         }
58     }
59 }
60 
61 signed main()
62 {
63     n=read();
64     m=read();
65     s=read();
66     for (int i=1;i<=m;i++)
67     {
68         int u=read();
69         int v=read();
70         int w=read();
71         add(u,v,w);
72     }
73     SPFA();
74     for (int i=1;i<=n;i++)
75     {
76         if(s==i)
77             cout<<0<<" ";
78         else
79             cout<<dis[i]<<" ";
80     }
81     return 0;
82 }
SPFA

标签:图论,ch,int,短路,笔记,无向,仙人掌,dis
From: https://www.cnblogs.com/G7526122/p/17342608.html

相关文章

  • mysql学习笔记2023年3月10日
    navicat 用法 ①创建数据库  ②创建数据表 外键  ③新建查询  ④转储SQL文件(执行的就是mysqldump命令) ⑤执行SQL文件前,需要先创建数据库临时表 (select*fromtb1)asB;  临时表表名为B select sidfromB; ......
  • 安装centos stream 8的笔记
    一、安装下载centosstream8的iso文件:https://mirrors.tuna.tsinghua.edu.cn/centos/8-stream/isos/x86_64/安装过程与之前的centos类似,我这里进行的是在vmwareworkstation16.1中安装。文件系统配置建议/boot512MB占sda1,LVM管理/和swap,创建sda2作为物理卷,vg00作为卷组,s......
  • JavaScript学习笔记
    数组什么是数组?字面理解就是数字的组合其实不太准确,准确的来说数组是一个数据的集合也就是我们把一些数据放在一个盒子里面,按照顺序排好[1,2,3,'hello',true,false]这个东西就是一个数组,存储着一些数据的集合数据类型分类number/string/boolean/undefined/null/ob......
  • 软件工程日报——《用户故事与迅捷方法》读书笔记一
    《用户故事与迅捷方法》(UserStoriesApplied:ForAgileSoftwareDevelopment)是一本介绍敏捷软件开发中用户故事的书籍。下面是我的读书笔记:作者MikeCohn从如何编写用户故事开始,逐步给读者讲解了使用用户故事做敏捷开发的过程、如何划分优先级以及评估和计划等内容。以下是......
  • 程序员修炼之道阅读笔记
    第19节文本操纵1、学习一种文本操纵语言。文本操作语言对于编程的意义,就像是刳刨机对于木工活的意义。2、文本操作的案例。我们的测试数据有好几万条,散落在不同文件,如果需要进行合并并转换为特定格式,手动处理是无法想象的。但如果使用Perl几个小时就可以完成。数据库sche......
  • 四月第二篇阅读笔记
    在这本《人月神话》中,其中提到了软件系统的复杂性远远超过了建筑行业和制造行业,软件的需求是在人的脑子中很快形成的一种想法,用我们的自然语言都很难完整、准确的表达给对方。一般情况下,人们只有在看到一个已运行的APP或者网站以后才会说:“哦,我要的其实不是这个功能,其实我想得是能......
  • 计网学习笔记九 Routing Fundamentals
    在这一讲开始讲路由器的控制平面。简单介绍了routing,两个最小cost算法。参考看的文章:VC网络中的路由VC网络和数据报网络中路由的区别:DifferencesbetweenVirtualCircuitsandDatagramNetworks三种路由方式(静态、默认和动态):TypesofRoutingRouting简介network对象不同......
  • Java学习笔记(三)
    1.  请描述你理解的循环按照一定次数重复地执行程序,直至达到次数上限,将重复的代码只编写一次,然后再重复执行即可,这样的程序结构就是循环结构。2.  请描述嵌套for循环执行的过程嵌套循环是先执行外层循环,然后再执行内层循环。外层循环执行一次,内层执行若干次,当内层执行完......
  • 模板——图论
    缩点(强连通分量)点击查看代码constintN=1e5+5,inf=1e9;vector<int>a[N];stack<int>stk;boolvis[N],instk[N];intdfn[N],low[N],col[N],w[N];//co:染色结果,w:点权vector<int>sz;//sz:第i个颜色的点数intn,m,dcnt;//voiddfs(intx){//Tarjan求强联通分量......
  • AOP学习笔记
    概念什么是AOP(1)面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能(3)使用登录例子说明AOP登录例子术语连接点(joinpoint):类里面......