图论与代数结构

基本概念

图的概念

多重图:含有重边的图

d + ( v ) d^+(v) d+(v):出度

支撑子图: G ′ G' G G G G的子图,且满足 V ′ = V V'=V V=V

导出子图: G ′ G' G G G G的子图, E ′ E' E包含 G G G V ′ V' V中所有的边

G 1 ⊕ G 2 = ( V 1 ∪ V 2 , E 1 ⊕ E 2 ) G_1\oplus G_2=(V_1\cup V_2,E_1\oplus E_2) G1G2=(V1V2,E1E2)

G G G的补图 G ‾ \overline{G} G K n − G K_n-G KnG

点v的直接后继集: Γ + ( v ) = { u ∣ ( v , u ) ∈ E } \Gamma^+(v)=\{u|(v,u)\in E\} Γ+(v)={u(v,u)E}

图同构的必要条件: ∣ V 1 ∣ = ∣ V 2 ∣    ∣ E 1 ∣ = ∣ E 2 ∣ |V_1|=|V_2|\;|E_1|=|E_2| V1=V2E1=E2 结点度的非增序列相同 存在同构的导出子图

图的代数表示

1.邻接矩阵

2.权矩阵

3.关联矩阵

有向图:
b i j = { 1 e j = ( v i , v k ) ∈ E − 1 e j = ( v k , v i ) ∈ E 0 d e f a u l t b_{ij}=\left\{\begin{matrix} 1 & e_j=(v_i,v_k)\in E\\ -1 & e_j=(v_k,v_i)\in E\\ 0 & default \end{matrix}\right. bij=110ej=(vi,vk)Eej=(vk,vi)Edefault
无向图:
b i j = { 1 e j = ( v i , v k )    o r    ( v k , v i ) ∈ E 0 d e f a u l t b_{ij}=\left\{\begin{matrix} 1 & e_j=(v_i,v_k)\;or\;(v_k,v_i)\in E\\ 0 & default \end{matrix}\right. bij={10ej=(vi,vk)or(vk,vi)Edefault
4.边列表

5.正向表:使用以下方法表示E={(1,2),(1,3),(1,4),(4,2),(4,4),(6,4)}
[ v 1 v 2 v 3 v 4 v e n d 1 4 6 7 7 2 3 4 2 4 4 ] \begin{bmatrix} v_1 & v_2 & v_3 & v_4 & v_{end} & \\ 1 & 4 & 6 & 7 & 7 & \\ 2 & 3 & 4 & 2 & 4 & 4 \end{bmatrix} v112v243v364v472vend744
6.逆向表

7.邻接表:使用链表存储一个节点的直接后继集

道路与回路

道路与回路

简单有向道路/回路:边不重复

初级有向道路/回路:点不重复

有向图的连通性:先转换为无向图,然后判断连通性

道路与回路的判定

Warshall算法

P=A;
for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
		for(int k=1;k<=n;k++)
			P[j][k]=P[j][k]|(P[j][i]&P[i][k]);

欧拉道路与回路

无向连通图 G G G存在欧拉回路的充要条件是 G G G中结点的度都是偶数

充分性证明:每次构造出一条回路,并删去回路上的边,将构造出的回路取并集

有向连通图 G G G中各结点正负度相同,则存在有向欧拉回路

G G G中有k个度为奇数的点,则 E E E可以划分为 k 2 \frac{k}{2} 2k条简单道路

哈密顿回路

定理:对于简单图 G G G中任意两点 v i , v j v_i,v_j vi,vj,有 d ( v i ) + d ( v j ) ≥ n − 1 d(v_i)+d(v_j)\geq n-1 d(vi)+d(vj)n1 G G G中存在哈密顿道路

证明:

(1) G G G是连通图:若存在两个连通支,每个连通支中取一点,考虑度数和,矛盾

(2) G G G存在Hamilton道路

( v i 1 . . . v i l ) (v_{i1}...v_{il}) (vi1...vil)是一条极长的初级道路,则 v i 1 v_{i1} vi1 v i l v_{il} vil所有邻点都在道路上,若 l < n l<n l<n,则一定存在经过 v i 1 . . . v i l v_{i1}...v_{il} vi1...vil的初级回路,由连通图,存在不在回路上且与回路上点 v i x v_{ix} vix相邻的点 v j v_j vj,在回路上拆掉一条边并加上这条边 ( v i x , v j ) (v_{ix},v_j) (vix,vj)即可

推论:对于简单图 G G G中任意两点 v i , v j v_i,v_j vi,vj,有 d ( v i ) + d ( v j ) ≥ n d(v_i)+d(v_j)\geq n d(vi)+d(vj)n G G G中存在哈密顿回路

证明:由定理, G G G有H道路,设端点为 v 1 , v n v_1,v_n v1,vn,若 G G G不存在 H H H回路,一定有 d ( v 1 ) + d ( v n ) ≤ n − 1 d(v_1)+d(v_n)\leq n-1 d(v1)+d(vn)n1

引理: G G G是简单图, v i , v j v_i,v_j vi,vj是不相邻的节点,且满足 d ( v i ) + d ( v j ) ≥ n d(v_i)+d(v_j)\geq n d(vi)+d(vj)n,则 G G G存在H回路的充要条件是 G + ( v i , v j ) G+(v_i,v_j) G+(vi,vj)有H回路

证明:假设不存在,则 G + ( v i , v j ) G+(v_i,v_j) G+(vi,vj)的H回路一定过 ( v i , v j ) (v_i,v_j) (vi,vj),删去后存在H道路,又有 d ( v i ) + d ( v j ) < n d(v_i)+d(v_j)<n d(vi)+d(vj)<n

闭合图 C ( G ) C(G) C(G):简单图 G G G中不相邻的点 v i , v j v_i,v_j vi,vj,若 d ( v i ) + d ( v j ) ≥ n d(v_i)+d(v_j)\geq n d(vi)+d(vj)n,令 G ′ = G + ( v i , v j ) G'=G+(v_i,v_j) G=G+(vi,vj),直到不可做为止,闭合图唯一

定理:简单图 G G G存在H回路的充要条件是 C ( G ) C(G) C(G)存在H回路

旅行商问题

寻找权值最小的H回路

分支定界法

1.对边权值排序,在边权序列中选择n条边,判断是否构成H回路

2.删除当前待选边集中的最长边,加入后面第一条待选边,剪支

3.回溯

便宜算法(近似算法)

  1. 开始时,T是结点1的自环

  2. 每次选择不在环上与环最近的一个点,拆分掉相邻的两条边中较短的一条,将该点和与环相连的边加入到环上

  3. 重复直到包含所有节点

设旅行商问题最佳解释 O n O_n On,便宜算法的解是 T n T_n Tn,则 T n O n < 2 \frac{T_n}{O_n}<2 OnTn<2

最短路径

//dfs_spfa
bool dfs_spfa(int x)
{
    vis[x]=1;
    for(int t=head[x];t;t=data[t].ne)
    {
        int y=data[t].b;
        if(dis[y]>dis[x]+data[t].c)
        {
            dis[y]=dis[x]+data[t].c;
            if(vis[y]||dfs_spfa(y))
            {
                vis[x]=0;
                return 1;//存在负权圈
            }
        }
    }
    vis[x]=0;
    return 0;
}
void bfs_spfa()
{
    queue<int>q;
    memset(dis,0x7fffffff,sizeof dis);
    memset(inq,0,sizeof inq);
    q.push_back(S);dis[S]=0;inq[S]=1;
    while(!q.empty())
    {
        int x=q.front();q.pop();inq[x]=0;
        for(int t=head[x];t;t=data[t].ne){
            int y=data[t].b;
            if(dis[x]+data[t].c<dis[y]){
                dis[y]=dis[x]+data[t].c;
                if(!inq[y])
                {
                    q.push(y);
                    inq[y]=1;
                }
            }
        }
    }
}

在负权边较少的情况下,忽略负权边跑dijkstra,通过dijkstra算法给出跑Bellman-Ford算法的结点序

关键路径

PT图:结点表示工序,边表示依赖关系,边 e i j e_{ij} eij的权 w i j w_{ij} wij表示工序i的时长

v 1 . . . v n v_1...v_n v1...vn是拓扑排序后的点的顺序,不妨设 v 1 v_1 v1是唯一入度为0的点, v n v_n vn是唯一出度为0的点

最早启动时间: v 1 v_1 v1 v i v_i vi的最长路

最晚启动时间:工程所用时间 - v i v_i vi v n v_n vn的最长路

PERT图:有向边表示工序,权值表示所需时间,若工序 e i e_i ei完成 e j e_j ej才开始,令 v k v_k vk e i e_i ei的终点, e j e_j ej的起点

最早启动时间: v 1 v_1 v1 v i v_i vi的最长路

最晚启动时间:工程所用时间- v j v_j vj v n v_n vn的最长路- w ( i , j ) w(i,j) w(i,j)

中国邮路问题

正权连通图G中,求从某个节点出发经过每条边至少一次最后返回出发点的最短回路

定理:L是无向连通图G最佳邮路的充要条件是

1.G的每条边至多重复一次

2.G的任意一个回路上,重复边长度之和不超过该回路长度的一半

无向图中邮路问题:

找出所有度数为奇数的点,求出两两之间的最短路,然后求出最小权匹配

给定图 G G G的一棵树 T T T,称 G − T G-T GT为余树,记作 T ‾ \overline T T

基本关联矩阵及其性质

基本关联矩阵:有向图连通 G = ( V , E ) G=(V,E) G=(V,E)的关联矩阵 B B B中划去任意节点 v k v_k vk所对应的行,得到的 ( n − 1 ) × m (n-1)\times m (n1)×m的矩阵 B k B_k Bk称为 G G G的一个基本关联矩阵

定理:设 B B B是有向连通图 G G G的关联矩阵,则 r a n k    B = n − 1 rank \; B=n-1 rankB=n1

证明:只需证 r a n k    B ≥ n − 1 rank \;B\geq n-1 rankBn1,设B中最少的线性相关的行数为l,不妨设为第 i 1 . . . i l i_1...i_l i1...il行,则有 k 1 r i 1 + k 2 r i 2 + . . . k l r i l = 0 k_1r_{i_1}+k_2r_{i_2}+...k_lr_{i_l}=0 k1ri1+k2ri2+...klril=0,其中 k i ≠ 0 k_i \not =0 ki=0,在矩阵B中,每列有两个非零元,则这 l l l个向量 r i 1 . . . r i l r_{i_1}...r_{i_l} ri1...ril中每行至多两个非零元,若存在一行只有一个非零元,则矛盾,现在将B中行行交换,列列交换,则使这 l l l行交换到前 l l l行,则将每列都有的两个非零元交换到前 r r r列,则矩阵B变为
B ′ = [ P l × r 0 0 Q ( n − l ) × ( m − r ) ] B'=\begin{bmatrix} P_{l\times r} & 0\\ 0 & Q_{(n-l)\times(m-r)} \end{bmatrix} B=[Pl×r00Q(nl)×(mr)]
n ≠ l n\not= l n=l,则图G为非连通图,矛盾

推论: n n n个节点树 T T T的基本关联矩阵的秩是 n − 1 n-1 n1

定理:设 B k B_k Bk是连通图 G G G的基本关联矩阵, C C C G G G中的一个回路,则 G G G中各边所对应 B k B_k Bk的各列线性相关

定理:令 B k B_k Bk是有向连通图 G G G的基本关联矩阵,那么 B k B_k Bk的任意 n − 1 n-1 n1阶子阵行列式非零的充要条件是其各列所对应的边构成 G G G的一棵支撑树

支撑树的计数

定理:设 B 0 B_0 B0是有向图 G G G关联矩阵 B B B的任意一个 k k k阶子方阵,则 d e t ( B 0 ) = 0 / 1 / − 1 det(B_0)=0/1/-1 det(B0)=0/1/1

Binet-Cauchy Theory:已知矩阵 A = ( a i j ) m × n A=(a_{ij})_{m\times n} A=(aij)m×n B = ( b i j ) n × m B=(b_{ij})_{n\times m} B=(bij)n×m 满足 m ≤ n m\leq n mn ∣ A B ∣ = ∑ i ∣ A i ∣ ∣ B i ∣ |AB|=\sum_{i}|A_{i}||B_{i}| AB=iAiBi ,其中 A i    B i A_i\;B_i AiBi都是m阶行列式, A i A_i Ai是从 A A A中取不同的 m m m列所成的行列式, B i B_i Bi同理

定理:设 B k B_k Bk是有向连通图 G = ( V , E ) G=(V,E) G=(V,E)某一基本关联矩阵,则 G G G的不同树的数目是 d e t ( B k B k T ) det(B_kB_k^T) det(BkBkT)

无向图生成树计数:对每边任给一方向即可

基尔霍夫定理:设无向图的Laplace矩阵(度矩阵-邻接矩阵)是Q,则 Q ∗ Q^* Q(Q中去掉任一第i行第i列)的行列式的值即为生出树个数

有根树的计数:

​ 任何以 v 0 v_0 v0为根的有根树的基本关联矩阵 B 0 B_0 B0中一定是每行每列都只有一个-1元素

​ 经过点和边的重编号,可以将 B 0 B_0 B0化为上三角矩阵,且对角线上都是-1

​ 将 B 0 B_0 B0中元素1变为0,行列式的值不变,若T不是根树,则行列式的值为0,因此有定理:有向连通图 G G G中以 v k v_k vk为根的根树数目是 d e t ( B → k B k T ) det(\overrightarrow B_k B_k^T) det(B kBkT),其中 B → k \overrightarrow B_k B k B k B_k Bk中所有1元素变为0

回路矩阵与割集矩阵

回路个数:最多为 2 m − n + 1 − 1 2^{m-n+1}-1 2mn+11个不同的初级回路

给定回路C的参考方向,与回路参考方向相同的边称作正向边,否则称作反向边

完全回路矩阵:C
C i j = { 1 e j ∈ C i 且 为 正 向 边 − 1 e j ∈ C i 且 为 反 向 边 0 d e f a u l t C_{ij}=\left\{\begin{matrix} 1 & e_j\in C_i 且为正向边\\ -1 & e_j\in C_i且为反向边\\ 0 & default \end{matrix}\right. Cij=110ejCiejCidefault
基本回路矩阵: C f ( m − n + 1 ) ∗ m C_{f(m-n+1)*m} Cf(mn+1)m

考虑每条余数边与支撑树上的若干条边构成唯一回路,参考方向为余数边的方向

易知, r a n k      C f = m − n + 1 rank \;\;C_f =m-n+1 rankCf=mn+1

将余数边放在前面,且次序与它所构成的回路一致,则可以写成
C f = [ I C f 12 ] C_f=\begin{bmatrix} I & C_{f12} \end{bmatrix} Cf=[ICf12]
定理:设有向连通图 G G G的关联矩阵 B B B与完全回路矩阵 C e C_e Ce的边次序一致时,恒有 B C e T = 0 BC_e^T=0 BCeT=0

定理:完全回路矩阵 C e C_e Ce的秩是m-n+1

证明:易知 r a n d    C e ≥ m − n + 1 rand\;C_e\geq m-n+1 randCemn+1,由Sylvester定理, r a n d    B + r a n d    C e ≤ m rand\;B+rand\;C_e\leq m randB+randCem ,得证

定义:由连通图G中m-n+1个互相独立的回路组成的矩阵,称为G的回路矩阵,记为C

性质: C = P C f C=PC_f C=PCf其中P为可逆矩阵

定理:连通图G的回路矩阵C任一m-n+1阶子阵行列式非零,当且仅当这些列对应了一棵余树

定理:若有向连通图 G = ( V , E ) G=(V,E) G=(V,E)的基本关联矩阵 B k B_k Bk与基本回路矩阵 C f C_f Cf的边顺序一致,设 C f = ( I , C f 12 ) C_f=(I,C_{f12}) Cf=(I,Cf12) B k = ( B 11 , B 12 ) B_k=(B_{11},B_{12}) Bk=(B11,B12),则有 C f 12 = − B 11 T B 12 T ( − 1 ) C_{f12}=-B_{11}^T{B_{12}^T}^{(-1)} Cf12=B11TB12T(1)

定义:设S是有向图G=(V,E)的边子集,若同时满足:G’=(V,E-S)比G的连通支数多1,对任意 S ′ ⊂ S S'\subset S SS,G与G’’=(V,E-S’)的连通支数相同,则称S是G的一个割集

完全割集矩阵: S e S_e Se
S i j = { 1 e j ∈ S i 且 方 向 一 致 − 1 e j ∈ S i 且 方 向 相 反 0 d e f a u l t S_{ij}=\left\{\begin{matrix} 1 & e_j\in S_i 且方向一致\\ -1 & e_j\in S_i且方向相反\\ 0 & default \end{matrix}\right. Sij=110ejSiejSidefault
基本割集矩阵: S f S_f Sf

考虑每条树边与若干余树边构成的的割集

易知, r a n d    S f = n − 1 rand\;S_f=n-1 randSf=n1

将余数边对应的列放在前,树边对应的列放在后且与割集顺序一致
S f = [ S f 11 I ] S_f=\begin{bmatrix} S_{f11} & I \end{bmatrix} Sf=[Sf11I]
定理:设有向连通图 G G G的完全割集矩阵 S e S_e Se与完全回路矩阵 C e C_e Ce的边次序一致时,恒有 S e C e T = 0 S_eC_e^T=0 SeCeT=0

定理:完全割集矩阵 S e S_e Se的秩是n-1

定理:割集矩阵S的任一n-1阶子阵行列式非零,当且仅当这些列对应G的某棵树

定理:若有向连通图 G = ( V , E ) G=(V,E) G=(V,E)的基本割集矩阵 S f S_f Sf与基本回路矩阵 C f C_f Cf的边顺序一致,设 C f = ( I , C f 12 ) C_f=(I,C_{f12}) Cf=(I,Cf12) S f = ( S f 11 , I ) S_f=(S_{f11},I) Sf=(Sf11,I),则有 S f 11 = − C f 12 T S_{f11}=-C_{f12}^T Sf11=Cf12T

平面图与图染色

平面图:若能把图G画在一个平面上,使任何两条边不相交,则称G为可平面图

域:设G是一个平面图,由它的若干边所构成的一个区域,区域内不含任何结点及边

域的相邻:两个域之间存在公共边界

欧拉公式: V + F = E + 2 V+F=E+2 V+F=E+2

对于拥有k个连通支的情况,有 V − E + F = k + 1 V-E+F=k+1 VE+F=k+1

定理:设平面图没有割边,且每个域的边界数至少为 t t t,则 m ≤ t ( n − 2 ) t − 2 m\leq \frac{t(n-2)}{t-2} mt2t(n2)

极大平面图:在任意两点之间加一条边一定会破坏图的平面性

极大平面图的性质:连通,不存在割边,每个域的边界数为3

定理: m = 3 n − 6      d = 2 n − 4 m=3n-6 \;\; d=2n-4 m=3n6d=2n4

推论:简单平面图 m ≤ 3 n − 6      d ≤ 2 n − 4 m\leq 3n-6\;\;d\leq 2n-4 m3n6d2n4

非平面图:

​ 点数最少非平面图 K 5 K_5 K5

​ 边数最少的非平面图 K 3 , 3 K_{3,3} K3,3

​ 证明:图中没有 K 3 K_3 K3子图,则 m ≤ 2 n − 4 m\leq 2n-4 m2n4

K 5 K_5 K5 K ( 1 ) K^{(1)} K(1)图, K 3 , 3 K_{3,3} K3,3 K ( 2 ) K^{(2)} K(2)图,在 K ( 1 ) K^{(1)} K(1)型图与 K ( 2 ) K^{(2)} K(2)型图的边上加一些点,称为 K K K型图

Kuratowski定理:图可平面化 ⇔ \Leftrightarrow 图不存在K型子图

图的平面性检测

对图G的每个连通支分别预处理和检测

预处理:删除割点,化为多个双联通分量,移去自环,用边代替度为2的点,移去重边

简单判断: n < 5 n<5 n<5 m < 9 m<9 m<9 m > 3 n − 6 m>3n-6 m>3n6

对偶图

注意一条边在域中时对偶图中有自环

性质:对平面图G,对偶图G*存在且唯一

性质:对偶图G*一定是连通图

性质:平面连通图的对偶图的对偶图是原图

注意:对偶图的对偶图不一定为原图,且对偶两次后点数边数可能发生变化(孤立点)

性质:设C是平面图G的初级回路,则对偶后为一割集

性质:G有对偶图当且仅当G可平面

四色猜想:在平面图上对域使用四种颜色进行着色,存在一种着色方案使得无相邻两个域使用同种颜色着色

定理:任意简单平面图都可以进行节点五着色

证明:数学归纳法,平面图一定存在一个节点度数<6

定理:若存在哈密顿回路,则四色问题成立

3-正则平面图:每个节点的度都是3

定理:若任何一个3-正则平面图的域可四着色,则任意平面图的域也可以四着色

任意平面图$\Rightarrow$3-正则平面图:将度数大于3的节点变成环,然后将每条边与环上点相连

色数与色数多项式

G的点着色数:给定图G,满足相邻节点颜色不同的最少色数,记作 γ ( G ) \gamma(G) γ(G)

G的边着色数:给定图G,满足相邻边颜色不同的最少色数,记作 β ( G ) \beta(G) β(G)

易知,将边用点代替并在相邻边对应的点之间连边, β ( G ) \beta(G) β(G)可以转换为 γ ( G ′ ) \gamma(G') γ(G)

定理:非空图 G G G γ ( G ) = 2 \gamma(G)=2 γ(G)=2当且仅当G没有奇回路

定理:平面连通图域可二着色当且仅当连通图G有欧拉回路

定理:对于任意一个图G, γ ( G ) ≤ d 0 + 1 \gamma(G)\leq d_0+1 γ(G)d0+1 d 0 = max ⁡ d ( v i ) d_0=\max d(v_i) d0=maxd(vi)

匹配与网络流

定理:M是G的最大匹配当且仅当G中不存在关于M的可增广道路

Hungary算法:

输入为二分图 G=(X,Y,E);
结点标记
	0:表示尚未搜索
	1:表示饱和点
	2:表示无法扩大匹配的点(仅对X中的结点)
1.任给初始匹配M,给饱和点“1”标记
2.判断X各结点是否都已有非零标记
	是, M是最大匹配,结束
	否,找一个“0”标记点x0∈X, 开始本次搜索
		令U←{x0},为本次搜索的X结点集
		令V←Φ,为本次已检查过的Y结点集
3.判断集合U的邻接点集Γ(U)=V?
	是,x0无扩大匹配,标x0为“2”,转2
	否,在Γ(U)-V中找一点yi,判断yi是否标记“1”(即饱和点)
		饱和点:存在xi使得边(xi,yi)∈M,令U←U+{xi},V←V+{yi},转3
		非饱和点:存在从x0到yj的可增广路P,令M←M xor P,给x0,yi标记1,转2
bool path(int x)
{
    for(int t=head[x];t;t=da[t].ne)
    {
        int y=da[t].b;
        if(!flag[y])
        {
            flag[y]=1;
            if(!closed[y]||path(closed[y]))
            {closed[y]=x;return true;}
        }
    }
    return false;
}
int hungery()
{
    memset(closed,0,sizeof closed);
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        memset(flag,0,sizeof(flag));
        if(path(i))ans++;
    }
   	return ans;
}

Hall定理:在二分图G=(X,Y,E)中,X到Y存在完全匹配的充要条件是对于X的任意子集A,恒有|Γ(A)|≥|A|

推论:若二分图G=(X,Y,E)的每个结点xi∈X,都有d(xi)≥k,每个结点yj∈Y,都有d(yj)≤k,则X到Y存在完全匹配

定理:在二分图中, X X X Y Y Y的最大匹配数是 ∣ X ∣ − δ ( G ) |X|-\delta(G) Xδ(G),其中 δ ( G ) = max ⁡ A ⊆ X ∣ A ∣ − ∣ Γ ( A ) ∣ \delta(G)=\max_{A\subseteq X}|A|-|\Gamma(A)| δ(G)=maxAXAΓ(A)

将二分图中边用邻接矩阵表示,记作A

覆盖:适当地选取A的某些行和列,使这些行和列能盖住A的全部非零元,称为A的覆盖

最小覆盖:如果选取最少的行与列就能覆盖A的全部非零元,则称这样的覆盖为最小覆盖

定理:二分图的最大匹配数,与其邻接矩阵的最小覆盖数s相等

最佳匹配:如果边权是非负实数,而且存在多个完全匹配,那么其中权和最大或最小的完全匹配就叫最佳匹配

最大权匹配算法:已知利润矩阵C

1.在C的每行中选一最大值作为本行的界值l(xi),每列的界值l(yj)=0,构造矩阵B=(bij)n×n,其中bij=l(xi)+l(yj)-cij
2.在B中对0元素进行最小覆盖,覆盖数为r
	若r=n,转4
	在未覆盖的元素中选最小非零元δ
	若xi行,yj列均已覆盖,则bij←bij+δ
	若xi行,yj列均未覆盖,则bij←bij-δ
3.修改界值
	若xi行没覆盖,则l(xi)←l(xi)-δ
	若yj列已覆盖,则l(yj)←l(yj)+δ
	删除覆盖标记,转2
4.sum(l(xi)+l(yj))即为最大权,结束

网络流

Edmonds-Karp算法 O(nm^2)
给S标号(-1,inf)
按先标号先检查的顺序,选择标号最早但尚未检查过的节点u,若所有节点都检查过,转line 6否则对u所有未标邻点v,若能通过正向边或反向边标号,则标号
若T得到标号,反向增广,否则转line 3
重新开始标号,转line 2
结束

图的连通性

定理: 设G是至少有3个结点的连通图,则下述性质等价

·G是一个块(无割点)

·G的任何两结点属于某一初级回路

·G的任何一个结点和任何一条边同属于某一初级回路

·G的任何两条边属于某一初级回路

·给定两个结点u,v和一条边e,存在一条包含e的初级道路 P u v P_{uv} Puv

·对G的任意三个不同结点(及其顺序),存在一条包含它们的初级道路

·对G的任意三个不同结点(及其顺序),存在一条只包含其中两点而不含第三点

定义:连通图G在移去若干结点之后至少分为两个连通子图或剩下一个孤立结点,则这些结点的集合称为G的一个点断集或断集,记为A,称 κ ( G ) = min ⁡ ∣ A ∣ \kappa(G)=\min|A| κ(G)=minA为断量

定义:如果连通图G移去若干条边之后变为非连通的,则这些边的集合称为G的一个边断集,记为B,并称 λ ( G ) = min ⁡ ∣ B ∣ \lambda(G)=\min{|B|} λ(G)=minB为边断量

定理:连通图G中,有 κ ( G ) ≤ λ ( G ) ≤ δ ( G ) \kappa(G)\leq\lambda(G)\leq\delta(G) κ(G)λ(G)δ(G),其中 δ ( G ) \delta(G) δ(G)是节点的最小度

定义:G是连通图,任给定 k ≥ 1 k\geq 1 k1,当 κ ( G ) ≥ k \kappa(G)\geq k κ(G)k时,称G是k连通图(最少要去掉k个点才能不连通),类似地, λ ( G ) ≥ k λ(G) ≥k λ(G)k时,称为k边连通图

定理:简单图G中有 κ ( G ) ≤ ⌈ 2 m n ⌉ \kappa(G)\leq \left\lceil\frac{2m}{n}\right\rceil κ(G)n2m

对于一个k连通简单图,如果令f(k,n)表示其边数目m,不等式 f ( k , n ) ≥ ⌈ k n 2 ⌉ f(k,n)≥\left\lceil\frac{kn}{2}\right\rceil f(k,n)2kn

取等条件:哈拉里构造方法,设节点为 v 0 . . . v n − 1 v_0...v_n-1 v0...vn1

·k=2r,若 i − j ≤ r ( m o d      n ) i-j\leq r(mod \;\;n) ijr(modn),则 ( v i , v j ) ∈ E (v_i,v_j)\in E (vi,vj)E

·k=2r+1且n=2l,若 i − j ≤ r ( m o d      n ) i-j\leq r(mod\;\;n) ijr(modn),则 ( v i , v j ) ∈ E (v_i,v_j)\in E (vi,vj)E,若 i − j = l ( m o d      n ) i-j=l(mod\;\;n) ij=l(modn),则 ( v i , v j ) ∈ E (v_i,v_j)\in E (vi,vj)E

·k=2r+1且n=2l+1,若 i − j ≤ r ( m o d      n ) i-j\leq r(mod\;\;n) ijr(modn),则 ( v i , v j ) ∈ E (v_i,v_j)\in E (vi,vj)E,若 i − j = l + 1 ( m o d      n ) i-j=l+1(mod\;\;n) ij=l+1(modn),则 ( v i , v j ) ∈ E (v_i,v_j)\in E (vi,vj)E,对剩余的点 v t v_t vt,令 v t v_t vt与满足 t − j = l ( m o d      n ) t-j=l(mod\;\;n) tj=l(modn)的某点 v j v_j vj相邻

##代数结构

R R R为等价关系,则 a ‾ = { x ∈ A ∣ x R a } \overline{a}=\{x\in A|x R a\} a={xAxRa}

商集: A / R = A ‾ = { a ‾ ∣ a ∈ A } A/R=\overline{A}=\{ \overline{a}|a\in A\} A/R=A={aaA},其中 a ‾ \overline{a} a表示a所在的等价类

定理:设f是 A → B A\rightarrow B AB的一个满射,则f可以确定A的一个等价关系

定理:设f是 A → B A\rightarrow B AB的满射,则存在唯一的一个双射 f ∗ : A / R → B f^*:A/R\rightarrow B f:A/RB,使得 f = f ∗ γ f=f^*\gamma f=fγ,其中 R R R是由f确定的等价关系, γ \gamma γ A → A / R A\rightarrow A/R AA/R的自然映射

代数系统

定义:集合A和运算 f 1 , f 2 , … f s f_1 ,f_2 ,…f_s f1,f2,fs所组成的系统,称为一个代数系统(或一个代数结构),简称为一个代数,用记号 ( A , f 1 , f 2 , … , f s ) (A,f_1 ,f_2 ,…,f_s ) (A,f1,f2,,fs)表示,当A是有限集合时,也称该系统是有限代数系统

定义:在代数系统 ( X , ⋅ ) (X,·) (X,)中,如果对所有的 x i , x j ∈ X x_i ,x_j \in X xi,xjX,有 x i ⋅ x j = x j ⋅ x i x_i·x_j =x_j ·x_i xixj=xjxi成立,则称代数系统 ( X , ⋅ ) (X,·) (X,)对于二元运算·适合交换律

定义:如果对任意 x i , x j , x k ∈ X x_i ,x_j ,x_k \in X xi,xj,xkX ( x i ⋅ x j ) ⋅ x k = x i ⋅ ( x j ⋅ x k ) (x_i ·x_j )·x_k =x_i ·(x_j ·x_k ) (xixj)xk=xi(xjxk)成立,则称代数系统 ( X , ⋅ ) (X,·) (X,)对于二元运算·适合结合律

如果 ( X , ⋅ ) (X,·) (X,)对于·适合结合律,那么也一定适合多个元素的广义结合律,可以在表达式中省略括号,并定义x的n次幂 ( n ≥ 1 ) (n\geq 1) (n1)

定义:给定一个代数系统 V = ( X , ⋅ ) V=(X,·) V=(X,),如果存在一个元素 e L e_L eL(或者 e R e_R eR)属于X,使得对于任意元素 x ∈ X x \in X xX,有 e L ⋅ x = x e_L ·x=x eLx=x(或 x ⋅ e R = x x·e_R =x xeR=x),称 e L e_L eL(或 e R e_R eR)是X上关于运算·的一个左(或右)单位元,若e既是左单位元又是右单位元,则称之为单位元

定理:若代数系统 V = ( X , ⋅ ) V=(X,·) V=(X,)有左单位元 e L e_L eL,又有右单位元 e R e_R eR,则 e = e L = e R e=e_L =e_R e=eL=eR是X唯一单位元

定义:设 V = ( X , ⋅ ) V=(X,·) V=(X,)有单位元e的代数系统,对于 x ∈ X x \in X xX,若存在一个元素 x ′ x' x,使得 x ′ ⋅ x = e x'·x=e xx=e,则称x是左可逆的,并称 x ′ x' x是x的一个左逆元,若存在 x ′ ′ ∈ X x'' \in X xX,使得 x ⋅ x ′ ′ = e x·x''=e xx=e,则称x是右可逆的,并称 x ′ ′ x'' x是x的一个右逆元,若x既是左可逆又是右可逆的,则说x是可逆元

定理:设代数系统 V = ( X , ⋅ ) V=(X,·) V=(X,)具有单位元e,且适合结合律,对于 x ∈ X x\in X xX,x有左逆元 x ′ x' x,又有右逆元 x ′ ′ x'' x,则x有唯一的逆元 x − 1 = x ′ = x ′ ′ x^{-1} =x'=x'' x1=x=x,并且 ( x − 1 ) − 1 = x (x^{-1} )^{-1} =x (x1)1=x

定义: 设 V 1 = ( X , o 1 , o 2 , … , o r ) V_1 =(X,o_1 ,o_2 ,…,o_r ) V1=(X,o1,o2,,or) V 2 = ( X , o 1 ′ , o 2 ′ , … , o r ′ ) V_2 =(X,o_1' ,o_2' ,…,o_r' ) V2=(X,o1,o2,,or)是两个代数系统, o i o_i oi o i ′ o_i' oi都是 k i k_i ki元运算, k i k_i ki是正整数, i = 1 , 2 , … , r i=1,2,…,r i=1,2,,r,则说代数系统 V 1 V_1 V1 V 2 V_2 V2是同类型的

定义:设 ( X , ⋅ ) (X,·) (X,) ( Y , ∗ ) (Y,*) (Y,)是两个同类型的代数系统, f : X → Y f:X→Y f:XY是一个双射。如果对任意元a,b属于X,恒有 f ( a ⋅ b ) = f ( a ) ∗ f ( b ) f(a·b)=f(a)*f(b) f(ab)f(a)f(b)则称f是 ( X , ⋅ ) (X,·) (X,) ( Y , ∗ ) (Y,*) (Y,)的一个同构映射,并称 ( X , ⋅ ) (X,·) (X,) ( Y , ∗ ) (Y,*) (Y,)同构,用 X ≌ Y X≌Y XY表示

定义:若以上的f是一般映射,则称f是 ( X , ⋅ ) (X,·) (X,) ( Y , ∗ ) (Y,*) (Y,)的一个同态映射, f ( X ) ⊆ Y f(X)\subseteq Y f(X)Y

定义: 设 ( S , ⋅ ) (S,·) (S,)是一个代数系统,R是S的一个非空子集,如果R在运算·下是封闭的,则称(R,·) 是 ( S , ⋅ ) (S,·) (S,)的一个子代数系统或子代数

定理:设映射 f : X → Y f:X→Y f:XY是从代数系统 ( X , ⋅ ) (X,·) (X,) ( Y , ∗ ) (Y,*) (Y,)的一个同态映射,则 ( f ( X ) , ∗ ) (f(X),*) (f(X),) ( Y , ∗ ) (Y,*) (Y,)的一个子代数,并称 ( f ( X ) , ∗ ) (f(X),*) (f(X),)是在f作用下 ( X , ⋅ ) (X,·) (X,)的同态象

定义:设 f : X → Y f:X→Y f:XY是从代数系统 ( X , ⋅ ) (X,·) (X,) ( Y , ∗ ) (Y,*) (Y,)的一个同态,如果f是单射,称f是单一同态,f是满射,称f是满同态,用X~Y表示,并称Y是X的一个同态象,当然如果f是双射,它就是同构

定理:给定代数系统 ( X , ⋅ ) (X,·) (X,) ( Y , ∗ ) (Y,*) (Y,),其中·和*都是二元运算。设 f : X → Y f:X→Y f:XY是从代数系统 ( X , ⋅ ) (X,·) (X,) ( Y , ∗ ) (Y,*) (Y,)的满同态,则如果·是可交换的或可结合的运算,则*也是可交换的或可结合的运算;若 ( X , ⋅ ) (X,·) (X,)中的运算·具有单位元e,则 ( Y , ∗ ) (Y,*) (Y,)中运算*具有单位元f(e),对运算·,如果每一个元素 x ∈ X x \in X xX都有逆元 x − 1 x^{-1} x1,则对运算*,每一个元素 f ( x ) ∈ Y f(x) \in Y f(x)Y都有逆元 f ( x − 1 ) f(x^{-1} ) f(x1)

定义:代数系统 ( X , ⋅ ) (X,·) (X,)上的同态映射 f : X → X f:X\rightarrow X f:XX称为自同态,若f是同构映射,则称之为自同构

半群

半群:满足结合律的代数系统

含幺半群(幺群):存在单位元的半群

交换幺群:满足交换律的幺群

循环幺群:设 ( M , ⋅ , e ) (M , · , e) (M,,e)是一个幺群,若存在一个元素 g ∈ M g ∈ M gM,使得对任意 a ∈ M a ∈M aM,a都可以写成g的方幂形式,即 a = g m a=g^m a=gm(m是非负数),则称 ( M , ⋅ , e ) (M , · , e) (M,,e)是一个循环幺群,g为生成元

定理:循环幺群是可交换幺群

子半群:设 ( S , ⋅ ) (S, ·) (S,)是一个半群, T ⊆ S T ⊆ S TS,在运算 · 的作用下如果T是封闭的,则称 ( T , ⋅ ) (T, ·) (T,) ( S , ⋅ ) (S, ·) (S,)的子半群

子幺群:设 ( M , ⋅ , e ) (M , · , e) (M,,e)是一个幺群, T ⊆ M T ⊆ M TM,在运算 · 的作用下,如果T是封闭的,且 e ∈ T e ∈ T eT,那么 ( T , ⋅ , e ) (T, · , e) (T,,e) ( M , ⋅ , e ) (M , · , e) (M,,e)的子幺群

群:设G是非空集合,· 是G上的二元运算,若代数系统 ( G , ⋅ ) (G, ·) (G,)满足适合结合律,存在单位元,G中的元素都是可逆元,则称代数系统(G, ·)是一个群。

Abel群:若群G的二元运算 · 满足交换律,则称G是交换群,或者阿贝尔(Abel)群

定义:规定集合G的基数为群 ( G , ⋅ ) (G, ·) (G,)的阶,当阶为某一整数时,该群为有限群;否则为无限群

Klein四元群:满足 x = x − 1 x=x^{-1} x=x1

定理:如果幺群M中只有一部分元素可逆,那么M中所有可逆元素构成的子集G是一个群

定理:设半群 ( G , ⋅ ) (G, ·) (G,)有一个左单位元(右单位元)e,且对每一个元 a ∈ G a ∈ G aG,都有左逆元(右逆元) a − 1 ∈ G a^{ -1} ∈ G a1G,则G是群

定理:设 ( G , ⋅ ) (G, ·) (G,)是半群,如果对G中任意两个元素 a , b a,b a,b, 从半群到方程 a x = b ax=b ax=b y a = b ya=b ya=b在G中有解,则G是一个群

定义:设a是G中的一个元素,若有正整数k存在,使 a k = e a^k = e ak=e,则满足 a k = e a^k = e ak=e的最小正整数k称为元素a的阶(或周期),记为 O < a > O<a> O<a>,并称a是有限阶元素

定理:设a是G中一个r阶元素,k是正整数,则 a k = e a^k =e ak=e,当且仅当 r ∣ k r|k rk O < a > = O < a − 1 > O<a>=O<a^{-1} > O<a>=O<a1> r < = ∣ G ∣ r<=|G| r<=G

定理:H是群G的非空子集,则H是G的子群的充要条件:

  1. H对G的运算是封闭的,即对于任意的 a , b ∈ H a,b ∈ H a,bH,都有 a b ∈ H ab ∈ H abH
  2. H中有单位元 e ′ e' e,且 e ′ = e e' = e e=e
  3. 对任意的 a ∈ H a ∈ H aH,都有 a − 1 a^{-1} a1 是a在H中的逆元

定理:G的非空子集H是G的子群的充要条件是:对于任意的 a , b ∈ H a , b ∈ H a,bH,都有 a b − 1 ∈ H ab^{ -1} ∈ H ab1H

循环群:若群G中存在一个元素a,使得G中的任一元素g,都可以表示成a的幂的形式,即 G = a k ∣ k ∈ Z G = { a_k | k ∈ Z } G=akkZ,则称G是循环群,记作 < a > <a> <a>,a称为G的生成元

定理:设 G = < a > G = <a> G=<a>,则

  1. O < a > = ∞ O<a> = ∞ O<a>=,则G中只有生成元a或者 a − 1 a^{-1} a1
  2. O < a > = n O<a> = n O<a>=n,则G中有 φ ( n ) φ(n) φ(n)个生成元,其中 φ ( n ) φ(n) φ(n)是欧拉函数

定理:设 G = < a > G = <a> G=<a>是循环群,循环群的子群H

  1. G的子群H都是循环群
  2. 若G是无限群,则H( H ≠ { e } H≠\{e\} H={e})也是无限循环群;若G是有限群,设 ∣ G ∣ = n |G|=n G=n,且 a k a_k ak 是H中a的最小正幂,则 ∣ H ∣ = n / k |H| = n/k H=n/k

定理:设G是n阶循环群,则对于n的每一个正因子d,G有且只有一个d阶子群

定理:设G是循环群 < a > <a> <a>,a为生成元,若$O = ∞ , 则 G 与 ,则G与 G(Z,+) 同 构 ; 若 同构;若 O = n , 则 G 与 ,则G与 G(Z_n ,+)$同构

定理:设G是一个群, ( G ′ , ⋅ ) (G',·) (G,)是一个代数系统,若存在G到G’的双射f,且保持运算,即对任意的$a,b ∈ G , 有 ,有 f(ab) =f(a)·f(b)$,则G’也是一个群

置换

置换:当|A|=n时,A中的一个一一变换,也称为n元置换

置换群:由置换构成的群

S n S_n Sn:n!个n元置换的集合

n次对称群: S n S_n Sn对于置换乘法构成群,称为n次对称群

n元置换群:n次对称群的子群

轮换:置换 σ \sigma σ满足 σ ( i 1 ) = i 2 \sigma(i_1)=i_2 σ(i1)=i2 σ ( i 2 ) = i 3 \sigma(i_2)=i_3 σ(i2)=i3,…,称 ( i 1 i 2 . . . i l ) (i_1i_2...i_l) (i1i2...il)是一个长度为l的轮换

定义:设 α \alpha α β \beta β S n S_n Sn中的两个轮换,若 α , β \alpha,\beta α,β中的元素都不同,则称 α \alpha α β \beta β不相交

定理:不相交的轮换乘法满足交换律

定理:设 α = ( i 1 . . . i n 1 ) ( j 1 . . . j n 2 ) . . . ( k 1 . . . k n r ) \alpha=(i_1...i_{n_1})(j_1...j_{n_2})...(k_1...k_{n_r}) α=(i1...in1)(j1...jn2)...(k1...knr),则 α \alpha α的阶是 n 1 . . . n r n_1...n_r n1...nr的最小公倍数

定理:任何置换可以表示为不相交轮换的乘积

定理:任何一个长度为l轮换可以表示为l-1个对换的乘积

例如: ( i 1    i 2    . . . i l ) = ( i 1    i l ) . . . ( i 1    i 2 ) (i_1\;i_2\;...i_l)=(i_1\;i_l)...(i_1\;i_2) (i1i2...il)=(i1il)...(i1i2)

定理:不管用什么方法把置换表示成对换之积,所得对换个数奇偶性相同

如果对换数为奇数,则为奇置换,否则为偶置换, N ( σ 1 σ 2 ) = N ( σ 1 ) + N ( σ 2 ) N(\sigma_1\sigma_2)=N(\sigma_1)+N(\sigma_2) N(σ1σ2)=N(σ1)+N(σ2)

定理:n次对称群 S n S_n Sn中所有偶置换的集合,对 S n S_n Sn中置换乘法构成子群,记作 A n A_n An,称为交错群,若 n ≥ 2 n\geq 2 n2,则 ∣ A n ∣ = n ! 2 |A_n|=\frac{n!}{2} An=2n!

Cayley定理:任何群G与一个变换群同构

构造变换群:任取 a ∈ G a\in G aG,定义 G G G上的变换 f a : x → a x      x ∈ G f_a:x\rightarrow ax\;\;x\in G fa:xaxxG

左陪集:设H是群G的一个子群,对任意的 a ∈ G a\in G aG,集合 a H = { a h ∣ h ∈ H } aH=\{ah|h\in H\} aH={ahhH}是左陪集

定理: ∣ a H ∣ = ∣ H ∣ |aH|=|H| aH=H a ∈ H ⇔ a H = H a\in H\Leftrightarrow aH=H aHaH=H ∀ x ∈ a H ⇒ x H = a H \forall x\in aH\Rightarrow xH=aH xaHxH=aH a H ≠ b H ⇒ a H ∩ b H = ∅ aH\not= bH\Rightarrow aH\cap bH=\varnothing aH=bHaHbH= a H = b H ⇒ a − 1 b ∈ H ∧ b − 1 a ∈ H aH=bH\Rightarrow a^{-1}b\in H \wedge b^{-1}a\in H aH=bHa1bHb1aH

定理:设G是有限群,H是G的子群,则存在正整数k,满足 G = a 1 H ∪ a 2 H ∪ . . . a k H G=a_1H\cup a_2H\cup...a_k H G=a1Ha2H...akH,其中 a i H ∩ a j H = ∅ a_iH\cap a_j H=\varnothing aiHajH=

定义:群G关于子群H的左(右)陪集的个数,称为H在G中的指数,记作 [ G : H ] [G:H] [G:H]

Lagrange定理:群G的阶=子群H的指数*H的阶

推论:设A,B是群G的两个有限子群,则 ∣ A B ∣ = ∣ A ∣ ∣ B ∣ ∣ A ∩ B ∣ |AB|=\frac{|A||B|}{|A\cap B|} AB=ABAB

正规子群:设H是G的一个子群,若 ∀ a ∈ G \forall a \in G aG,都有 a H = H a aH=Ha aH=Ha,则称H是G的一个正规子群,用符号 H △ G H\triangle G HG表示

定义:设H是G的一个正规子群,G/H表示H所有陪集构成的集合,称G/H为G关于H的商群

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
正向邻接和逆向邻接是图的邻接的两种常见实现方式。 正向邻接是指以顶点顺序和边链为存储结构的邻接,用于示有向图。在正向邻接中,每个顶点都对应一个链,链中存储了从该顶点出发的所有边的信息。通过遍历链,可以获取从该顶点出发的所有邻接顶点。 逆向邻接是指以顶点顺序和边链为存储结构的邻接,用于示有向图。在逆向邻接中,每个顶点都对应一个链,链中存储了指向该顶点的所有边的信息。通过遍历链,可以获取指向该顶点的所有邻接顶点。 下面是一个示例代码,演示了如何使用正向邻接和逆向邻接示有向图: ```cpp #include <iostream> #include <vector> using namespace std; // 边的结构体 struct Edge { int src; // 边的起始顶点 int dest; // 边的目标顶点 }; // 图的类 class Graph { private: int numVertices; // 图的顶点数 vector<vector<int>> adjList; // 邻接 public: // 构造函数 Graph(int vertices) { numVertices = vertices; adjList.resize(numVertices); } // 添加边 void addEdge(int src, int dest) { adjList[src].push_back(dest); } // 打印正向邻接 void printForwardAdjList() { for (int i = 0; i < numVertices; i++) { cout << "顶点 " << i << " 的邻接顶点有:"; for (int j = 0; j < adjList[i].size(); j++) { cout << adjList[i][j] << " "; } cout << endl; } } // 打印逆向邻接 void printReverseAdjList() { vector<vector<int>> reverseAdjList(numVertices); for (int i = 0; i < numVertices; i++) { for (int j = 0; j < adjList[i].size(); j++) { int dest = adjList[i][j]; reverseAdjList[dest].push_back(i); } } for (int i = 0; i < numVertices; i++) { cout << "指向顶点 " << i << " 的顶点有:"; for (int j = 0; j < reverseAdjList[i].size(); j++) { cout << reverseAdjList[i][j] << " "; } cout << endl; } } }; int main() { // 创建有向图 Graph graph(5); graph.addEdge(0, 1); graph.addEdge(0, 4); graph.addEdge(1, 2); graph.addEdge(1, 3); graph.addEdge(1, 4); graph.addEdge(2, 3); graph.addEdge(3, 4); // 打印正向邻接 cout << "正向邻接:" << endl; graph.printForwardAdjList(); // 打印逆向邻接 cout << "逆向邻接:" << endl; graph.printReverseAdjList(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值