一,图
1. 思维导图
1.
- 导图中的联系
- 连通图有n个顶点和e条边,其中n-1条边和e个顶点一个构成极小的强连通图,称该极小连通子图为此连通图的生成树
- 最小生成树、最短路径、关键路径与权有关
- Prim和Dijkstra:要计算某顶点加入以后是否改变lowest[]/dist[]的值;不过Prim是比较新加入的顶点是否与未加入顶点之间边的权值更小,而Dijkstra看的是源点是否能经由新加入的点拥有前往别的点的更小的路径
2. 基本概念
-
基本术语:
-
完全图(n个顶点和e条边):e=n(n-1)/2;
-
有向完全图(n个顶点和e条弧):e=n(n-1);
-
稀疏图与稠密图:e<nlogn ,为稀疏图;反之,为稠密图
-
邻接点:在同一条边/弧上的顶点
-
网络:带权的图
-
简单路径:序列号中的顶点不重复
-
简单回路:序列号中的第一个顶点和最后一个顶点相同的路径
-
连通图与连通分量(无向图里):
- 连通图:无向图中任意两个顶点之间都有路径相连
- 连通分量:若无向图为非连通图,图中各极大连通子图称为此图的连通分量
-
强连通图和强连通分量:
- 强连通图:有向图中任意两个顶点之间都有有向路径相连
- 强连通分量:有向图中图中各强连通子图称为此图的强连通分量
-
-
图的存储结构;
- 邻接矩阵:
- 无向图的邻接矩阵是对称的;有向图的邻接矩阵可能不对称
- 邻接矩阵:
-
遍历:
- DFS:从某个顶点出发,递归进行DFS
-
最小生成树(n个顶点,e=n-1):
- Prim:不断加点
- Kruskal:在点上加边
-
拓扑排序与AOV网(顶点为活动,有向边表示活动优先关系):重复以下操作,将入度为0的点加入拓扑序列中,并把每个它的邻接点入度减一,直到点都在拓扑序列中
-
关键路径与AOE网(有向边为活动,顶点为事件):
-
事件vi的最早发生时间:ve(j)=max{ve(i)+dut(<i,j>)};
-
事件vi的最迟发生时间:vl(i)=min{vl(j)-dut(<i,j>);
-
活动ai的最早开始时间:e(i)=ve(i);
-
活动ai的最晚开始时间: l(i);
-
关键活动(l(i)=e(i)):现有弧<j,k>弧的权值为dut(<j,k>)
- ve(i)=e(j);
- l(i)=vl(k)-dut(<j,k>)
-
3. 问题+解决方案
-
pta图着色问题计算总颜色数/一个序列里计算出现了多少种数
-
方案1(可能会超时):
cin >> a[i]; for (j = 1; j <i; j++) { if (a[i] == a[j] ) { flag1 = 0; break; } } if (flag1) { count++; }
-
方案2:
int a[501] = { 0 }, b[501] = { 0 }, c[501] = { 0 }; for (i = 1; i <= v; i++) { cin >> a[i]; b[a[i]]++;//计算每种颜色的数量 if (b[a[i]] == 1) { count++; } }
-