实验主题

生成树、环路空间、断集空间的求解

实验目的

1、掌握无向连通图生成树的求解方法;

2、掌握基本回路系统和环路空间的求解方法;

3、掌握基本割集系统和断集空间的求解方法;

4、了解生成树、环路空间和断集空间的实际应用。

实验要求

给定一无向简单连通图的相邻矩阵 (例如:)。

1、输出此图的关联矩阵M

2、求此图所有生成树个数。

3、输出其中任意一棵生成树的相邻矩阵(默认第i行对应顶点vi)和关联矩阵(默认第i行对应顶点vi,第j列对应边ej)。

4、求此生成树对应的基本回路系统(输出形式如:{e1e4e3,e2e5e3})。

5、求此生成树对应的环路空间(输出形式如:{Φ,e1e4e3,e2e5e3,e1e4e5e2})。

6、求此生成树对应的基本割集系统(输出形式如:{{e1,e4},{e2,e5},{e3,e4,e5}})。

7、求此生成树对应的断集空间(输出形式如:{Φ,{e1,e4},{e2,e5},{e3,e4,e5},{e1,e2,e4,e5},{e1,e3,e5},{e2,e3,e4},{e1,e2,e3}})。

实验内容

1. 输出关联矩阵

在相邻矩阵中,如果不为0,则表示这两点之间有边,如果大于1,表示有平行边,可以对相邻矩阵的每一行遍历,找到不为0的元素时,在新矩阵中新增一行,其中两点对应的位置置1,表示一条边,并同时将该元素和其关于主对角线元素-1,最后将矩阵输出即可。

def guanlian_matrix(l: list) -> list:length = len(l)lc = copy.deepcopy(l)m = []for i in range(length):for j in range(length):if lc[i][j] > 0:for k in range(lc[i][j]):t = [0] * lengtht[i], t[j] = 1, 1m.append(t)lc[i][j] -= 1lc[j][i] -= 1return m

输出:

print("===>关联矩阵")
g = guanlian_matrix(m)
print("   ", end="")
[print('e' + str(i), end="\t") for i in range(len(g))]
print()
for i in range(len(g[0])):print("v" + str(i), end="  ")for j in range(len(g)):print(g[j][i], end="\t")print()

2. 求生成树的个数

方法一:

设D(G)为图的度对角矩阵,A(G)为图的领接矩阵,则C = D ( G ) − A ( G ) 的任意一个余子式的值即为图G的生成树个数。C也成为拉式矩阵。分析得,拉式矩阵的对角线上的元素为相邻矩阵对应行上所有元素的求和,其他为相邻矩阵的相反数。得到拉式矩阵后,再取第一行第一列的余子式,也就是去除第一行和第一列的行列式。

求行列式,可以采用定义法,按第一行展开,得到的n个代数余子式,同样也是求行列式,再按照其第一行展开,一直递归到只剩一行时结束,即可算出行列式。这里使用了numpy中的函数实现。

def cal_tree(l: list) -> int:m = []for i in range(1, len(l)):t = []for j in range(1, len(l)):if i == j:t.append(sum(l[i]))else:t.append(-l[i][j])m.append(t)return int(round(np.linalg.det(np.array(m)), 0))

方法二:

可以去除关联矩阵中的任意一行,得到一个n-1行m列的矩阵,再在m条边中选择n-1条,组成一个新矩阵,计算该矩阵是否满秩,即计算行列式是否为0,如果不为0,则包含一个生成树。

def cal_tree(l: list) -> int:x = list(itertools.combinations(range(len(l)), len(l[0]) - 1))n = 0for each in x:matrix = [l[i][1:] for i in each]if np.linalg.det(matrix) != 0:n += 1return n

3. 输出一颗树的相邻矩阵和关联矩阵

利用上一题的方法二,取出其中的一个结果,其中从m中选出的n-1列就是选出的树枝。

对于排列组合,可以采用二进制枚举,从1 ~ 2n+1-1判断二进制数中有多少个1,如果符合需要组合的个数,则储存起来,其中1表示被选中,0表示不被选中。这里使用了itertools中的combination函数实现。

def tree(l: list) -> tuple:x = list(itertools.combinations(range(len(l)), len(l[0]) - 1))rep = []for each in x:matrix = [l[i][1:] for i in each]if np.linalg.det(matrix) != 0:rep = eachbreakxianglin = [[0] * len(l[0]) for _ in range(len(l[0]))]guanlian = [l[i] for i in rep]# 根据关联矩阵计算相邻矩阵for i in guanlian:e = [j for j in range(len(i)) if i[j] == 1]xianglin[e[0]][e[1]], xianglin[e[1]][e[0]] = 1, 1return xianglin, guanlian, rep

输出:

x, y, bian = tree(g)
print("===>生成树的相邻矩阵")
print("   ", end="")
[print('v' + str(i), end="\t") for i in range(len(x))]
print()
for i in range(len(x)):print("v" + str(i), end="  ")for j in range(len(x)):print(x[j][i], end="\t")print()print("===>生成树关联矩阵")
print("   ", end="")
[print('e' + str(i), end=" ") for i in bian]
print()
for i in range(len(y[0])):print("v" + str(i), end="  ")for j in range(len(y)):print(y[j][i], end="  ")print()

4. 求生成树对应的基本回路系统

根据生成树的边,可以求出该生成树对应的弦,再根据每根弦的两个顶点,在生成树找到两个顶点的一条通路,加上这条弦,构成一条回路,于是可以求出基本回路系统。寻找通路时,采用了BFS宽度优先搜索,以生成树中的一个顶点为根节点,搜索时保存其子节点,最后再根据保存的字节点,为每个字节点的父节点赋值。根据另一个点,向回找到根节点即为一条回路。

class Node:def __init__(self, num, pre=None):self.pre = preself.num = numself.succed = []def bfs_loop(matrix: list, start: int, end: int):points = [Node(i) for i in range(len(matrix))]visited = [False] * len(matrix)visited[start] = Truequeue = [start]# bfs搜索while queue:now = queue.pop(0)if now == end:breakfor i in range(len(matrix)):if matrix[now][i] == 1 and visited[i] == False:points[now].succed.append(points[i])queue.append(i)visited[i] = True# 为所有字节点的pre赋值,方便找到父节点for each in points:for i in each.succed:i.pre = eache = [end]# 从端点向回找,找到根节点结束while points[end].pre:end = points[end].pre.nume.insert(0, end)return edef loop(tree: list, guanlian: list, bian: list):xian = list(set(range(len(guanlian))) - set(bian))loops = []# 计算每条弦的回路中的点for each in xian:e = [i for i in range(len(guanlian[0])) if guanlian[each][i] == 1]x = bfs_loop(tree, e[0], e[1])x.append(e[0])loops.append(x)rep = []# 根据回路中的点求出对应的边for each in loops:n = 1x = []while n < len(each):t = [0] * len(guanlian[0])t[each[n - 1]], t[each[n]] = 1, 1for i in range(len(guanlian)):if guanlian[i] == t:x.append('e' + str(i))breakn += 1rep.append(x)return rep

5. 求此生成树对应的基本割集系统

可以对每一条树枝,先删除这条树枝,再以此加入弦,如果加入弦之后,图连通,则该弦应该再这条树枝生成的割集中,否则不在。判断连通,可以通过图的相邻矩阵进行bfs搜索,如果全部节点都被访问过的话,则为连通的。也可以使用实验一的方法。

def liantong(matrix: list) -> bool:visited = [False] * len(matrix)visited[0] = Truequeue = [0]# bfs搜索while queue:now = queue.pop(0)for i in range(len(matrix)):if matrix[now][i] == 1 and visited[i] == False:queue.append(i)visited[i] = Truereturn all(visited)def geji(xianglin: list, bian: list, guanlian: list):xian = list(set(range(len(guanlian))) - set(bian))rep = []for i in range(len(bian)):xianglin1 = copy.deepcopy(xianglin)# 删除树枝e = [_ for _ in range(len(guanlian[0])) if guanlian[bian[i]][_] == 1]xianglin1[e[0]][e[1]], xianglin1[e[1]][e[0]] = 0, 0x = ['e' + str(bian[i])]for each in xian:# 加上一条弦e = [_ for _ in range(len(guanlian[0])) if guanlian[each][_] == 1]xianglin1[e[0]][e[1]], xianglin1[e[1]][e[0]] = 1, 1if liantong(xianglin1):# 如果连通则去除该弦,并加入割集x.append('e' + str(each))e = [_ for _ in range(len(guanlian[0])) if guanlian[each][_] == 1]xianglin1[e[0]][e[1]], xianglin1[e[1]][e[0]] = 0, 0rep.append(x)return rep

6. 环路空间和断集空间

环路空间只需要对生成树的基本回路系统中取若干个(1~n)做环合运算即可得到结果。环合运算可以取取出的若干个中的第一个回路生成数组A,对于后面的每一个回路,如果其中有边在A中,则在A中删除这条边,如果没有则在A中加入这条边。

取若干个的操作可以使用二进制枚举法,从1~2n-1,1为被选中,0为不被选中,即可枚举出所有选择的情况,这里使用itertools中的combination实现。

割集空间与环路空间同理。

def space(circles: list):rep = copy.deepcopy(circles)for i in range(2, len(circles) + 1):x = itertools.combinations(range(len(circles)), i)for e in x:t = copy.deepcopy(circles[e[0]])for j in e[1:]:for each in circles[j]:if each in t:t.remove(each)else:t.append(each)if t not in rep:rep.append(t)return rep

实验测试数据、代码及相关结果分析

===>关联矩阵e0 e1  e2  e3  e4  e5  e6
v0  1   1   1   0   0   0   0
v1  1   0   0   1   1   0   0
v2  0   1   0   1   0   1   0
v3  0   0   0   0   0   1   1
v4  0   0   1   0   1   0   1
共有24颗树
===>生成树的相邻矩阵v0    v1  v2  v3  v4
v0  0   1   1   0   1
v1  1   0   0   0   0
v2  1   0   0   1   0
v3  0   0   1   0   0
v4  1   0   0   0   0
===>生成树关联矩阵e0 e1 e2 e5
v0  1  1  1  0
v1  1  0  0  0
v2  0  1  0  1
v3  0  0  0  1
v4  0  0  1  0
===>基本回路系统
{ e0e1e3,e0e2e4,e5e1e2e6  }
===>环路空间
{ Φ, e0e1e3, e0e2e4, e5e1e2e6, e1e3e2e4, e0e3e5e2e6, e0e4e5e1e6, e3e4e5e6 }
===>基本割集系统
{ { e0,e3,e4 }, { e1,e3,e6 }, { e2,e4,e6 }, { e5,e6 } }
===>断集空间
{ Φ, { e0,e3,e4 }, { e1,e3,e6 }, { e2,e4,e6 }, { e5,e6 }, { e0,e4,e1,e6 }, { e0,e3,e2,e6 }, { e0,e3,e4,e5,e6 }, { e1,e3,e2,e4 }, { e1,e3,e5 }, { e2,e4,e5 }, { e0,e1,e2 }, { e0,e4,e1,e5 }, { e0,e3,e2,e5 }, { e1,e3,e2,e4,e5,e6 }, { e0,e1,e2,e5,e6 } }

实验代码

Python

import numpy as np
import copy
import itertoolsdef guanlian_matrix(l: list) -> list:length = len(l)lc = copy.deepcopy(l)m = []for i in range(length):for j in range(length):if lc[i][j] > 0:for k in range(lc[i][j]):t = [0] * lengtht[i], t[j] = 1, 1m.append(t)lc[i][j] -= 1lc[j][i] -= 1return mdef cal_tree(l: list) -> int:m = []for i in range(1, len(l)):t = []for j in range(1, len(l)):if i == j:t.append(sum(l[i]))else:t.append(-l[i][j])m.append(t)return int(round(np.linalg.det(np.array(m)), 0))# def cal_tree(l: list):
#     x = list(itertools.combinations(range(len(l)), len(l[0]) - 1))
#     n = 0
#     for each in x:
#         matrix = [l[i][1:] for i in each]
#         if np.linalg.det(matrix) != 0:
#             n += 1
#     return ndef tree(l: list) -> tuple:x = list(itertools.combinations(range(len(l)), len(l[0]) - 1))rep = []for each in x:matrix = [l[i][1:] for i in each]if np.linalg.det(matrix) != 0:rep = eachbreakxianglin = [[0] * len(l[0]) for _ in range(len(l[0]))]guanlian = [l[i] for i in rep]for i in guanlian:e = [j for j in range(len(i)) if i[j] == 1]xianglin[e[0]][e[1]], xianglin[e[1]][e[0]] = 1, 1return xianglin, guanlian, repclass Node:def __init__(self, num, pre=None):self.pre = preself.num = numself.succed = []def bfs_loop(matrix: list, start: int, end: int):points = [Node(i) for i in range(len(matrix))]visited = [False] * len(matrix)visited[start] = Truequeue = [start]# bfs搜索while queue:now = queue.pop(0)if now == end:breakfor i in range(len(matrix)):if matrix[now][i] == 1 and visited[i] == False:points[now].succed.append(points[i])queue.append(i)visited[i] = True# 为所有字节点的pre赋值,方便找到父节点for each in points:for i in each.succed:i.pre = eache = [end]# 从端点向回找,找到根节点结束while points[end].pre:end = points[end].pre.nume.insert(0, end)return edef loop(tree: list, guanlian: list, bian: list):xian = list(set(range(len(guanlian))) - set(bian))loops = []# 计算每条弦的回路中的点for each in xian:e = [i for i in range(len(guanlian[0])) if guanlian[each][i] == 1]x = bfs_loop(tree, e[0], e[1])x.append(e[0])loops.append(x)rep = []# 根据回路中的点求出对应的边for each in loops:n = 1x = []while n < len(each):t = [0] * len(guanlian[0])t[each[n - 1]], t[each[n]] = 1, 1for i in range(len(guanlian)):if guanlian[i] == t:x.append('e' + str(i))breakn += 1rep.append(x)return repdef space(circles: list):rep = copy.deepcopy(circles)for i in range(2, len(circles) + 1):x = itertools.combinations(range(len(circles)), i)for e in x:t = copy.deepcopy(circles[e[0]])for j in e[1:]:for each in circles[j]:if each in t:t.remove(each)else:t.append(each)if t not in rep:rep.append(t)return repdef liantong(matrix: list) -> bool:visited = [False] * len(matrix)visited[0] = Truequeue = [0]# bfs搜索while queue:now = queue.pop(0)for i in range(len(matrix)):if matrix[now][i] == 1 and visited[i] == False:queue.append(i)visited[i] = Truereturn all(visited)def geji(xianglin: list, bian: list, guanlian: list):xian = list(set(range(len(guanlian))) - set(bian))rep = []for i in range(len(bian)):xianglin1 = copy.deepcopy(xianglin)# 删除树枝e = [_ for _ in range(len(guanlian[0])) if guanlian[bian[i]][_] == 1]xianglin1[e[0]][e[1]], xianglin1[e[1]][e[0]] = 0, 0x = ['e' + str(bian[i])]for each in xian:# 加上一条弦e = [_ for _ in range(len(guanlian[0])) if guanlian[each][_] == 1]xianglin1[e[0]][e[1]], xianglin1[e[1]][e[0]] = 1, 1if liantong(xianglin1):# 如果连通则去除该弦,并加入割集x.append('e' + str(each))e = [_ for _ in range(len(guanlian[0])) if guanlian[each][_] == 1]xianglin1[e[0]][e[1]], xianglin1[e[1]][e[0]] = 0, 0rep.append(x)return repm = []
x = input()
while x:m.append(list(map(int, x.split())))x = input()print("===>关联矩阵")
g = guanlian_matrix(m)
print("   ", end="")
[print('e' + str(i), end="\t") for i in range(len(g))]
print()
for i in range(len(g[0])):print("v" + str(i), end="  ")for j in range(len(g)):print(g[j][i], end="\t")print()tree_num = cal_tree(m)
print(f"共有{tree_num}颗树")x, y, bian = tree(g)
print("===>生成树的相邻矩阵")
print("   ", end="")
[print('v' + str(i), end="\t") for i in range(len(x))]
print()
for i in range(len(x)):print("v" + str(i), end="  ")for j in range(len(x)):print(x[j][i], end="\t")print()print("===>生成树关联矩阵")
print("   ", end="")
[print('e' + str(i), end=" ") for i in bian]
print()
for i in range(len(y[0])):print("v" + str(i), end="  ")for j in range(len(y)):print(y[j][i], end="  ")print()print("===>基本回路系统")
circles = loop(x, g, bian)
print("{ ", end="")
for i in range(len(circles)):if i != len(circles) - 1:print(''.join(circles[i]), end=",")else:print(''.join(circles[i]), end=" ")
print(" }")print("===>环路空间")
print("{ Φ, ", end="")
huanlu = space(circles)
for i in range(len(huanlu)):if i != len(huanlu) - 1:print(''.join(huanlu[i]), end=", ")else:print(''.join(huanlu[i]), end="")print(" }")print("===>基本割集系统")
gj = geji(x, bian, g)
print("{ ", end="")
for i in range(len(gj)):print("{ ", end="")if i != len(gj) - 1:print(','.join(gj[i]), end=" }, ")else:print(','.join(gj[i]), end=" }")
print(" }")print("===>断集空间")
dj = space(gj)
print("{ Φ, ", end="")
for i in range(len(dj)):print("{ ", end="")if i != len(dj) - 1:print(','.join(dj[i]), end=" }, ")else:print(','.join(dj[i]), end=" }")
print(" }")

CPP

#include "iostream"
#include "vector"
#include "cmath"
#include "queue"
#include "algorithm"using namespace std;vector<vector<int>> guanlianMatrix(vector<vector<int>> l) {vector<vector<int>> t;for (int i = 0; i < l.size(); i++) {for (int j = 0; j < l.size(); j++) {if (l[i][j] > 0) {for (int k = 0; k < l[i][j]; k++) {vector<int> line;line.assign(l.size(), 0);line[i] = 1;line[j] = 1;t.push_back(line);l[i][j]--;l[j][i]--;}}}}return t;
}//获得det[i][j]余子式行列式
vector<vector<int> > complementMinor(vector<vector<int>> det, int i, int j) {int n = det.size();//n为det的行,m为det的列;vector<vector<int>> ans(n - 1);//保存获得的结果for (int k = 0; k < n - 1; k++)for (int l = 0; l < n - 1; l++) {ans[k].push_back(det[k < i ? k : k + 1][l < j ? l : l + 1]);}return ans;
}int Det(vector<vector<int>> det) {int ans = 0;int n = det.size(), m = det[0].size();//n为det的行,m为det的列;if (n != m) {exit(1);}if (det.size() == 1)return det[0][0];for (int i = 0; i < m; i++) {ans += det[0][i] * pow(-1, i) * Det(complementMinor(det, 0, i));}return ans;
}int treeNum(vector<vector<int>> l) {vector<vector<int>> m;for (int i = 1; i < l.size(); i++) {vector<int> t;for (int j = 1; j < l.size(); j++) {if (i == j) {int sum = 0;for (int k: l[j]) {sum += k;}t.push_back(sum);} else {t.push_back(-l[i][j]);}}m.push_back(t);}return Det(m);
}void
tree(vector<vector<int>> l, vector<vector<int>> &xianglin, vector<vector<int>> &guanlian, vector<unsigned int> &bian) {for (int i = 1; i < 1 << l.size(); i++) {bian.clear();int n = 0;unsigned int x = i, place = 0;while (x) {if (x & 0x1) {bian.push_back(place);n++;}x >>= 1;place++;}if (n == l[0].size() - 1) {// 去除第一行判断矩阵是否满秩vector<vector<int>> matrix;for (auto j: bian) {vector<int> t;for (int k = 1; k < l[j].size(); k++) {t.push_back(l[j][k]);}matrix.push_back(t);}if (Det(matrix) != 0) break;}}// 计算关联矩阵for (auto x: bian) {guanlian.push_back(l[x]);}for (int i = 0; i < l[0].size(); i++) {vector<int> t;t.assign(l[0].size(), 0);xianglin.push_back(t);}// 计算相邻矩阵for (auto i: guanlian) {vector<int> e;for (int j = 0; j < i.size(); j++) {if (i[j] == 1) e.push_back(j);if (e.size() == 2) break;}xianglin[e[0]][e[1]] = 1;xianglin[e[1]][e[0]] = 1;}
}struct Node {Node *parent;int num;
};vector<unsigned int> bfs_loop(const vector<vector<int>> &tree, int start, int end) {vector<bool> visited;visited.assign(tree.size(), false);visited[start] = true;vector<Node> points;for (int i = 0; i < tree.size(); i++) {Node t{nullptr, i};points.push_back(t);}queue<int> q;q.push(start);while (!q.empty()) {int now = q.front();q.pop();for (int i = 0; i < tree.size(); i++) {if (tree[now][i] == 1 && !visited[i]) {points[i].parent = &points[now];q.push(i);visited[i] = true;}}if (now == end) break;}vector<unsigned int> road;road.push_back(end);while (points[end].parent) {end = points[end].parent->num;road.insert(road.begin(), end);}return road;
}vector<vector<int>> loop(const vector<vector<int>> &xianglin, vector<vector<int>> guanlian, vector<unsigned int> bian) {vector<unsigned int> xian;for (int i = 0; i < guanlian.size(); i++) {if (!count(bian.begin(), bian.end(), i)) {xian.push_back(i);}}vector<vector<unsigned int>> points;for (auto x: xian) {vector<unsigned int> e;for (int i = 0; i < guanlian[0].size(); i++) {if (guanlian[x][i] == 1) {e.push_back(i);}}vector<unsigned int> t = bfs_loop(xianglin, e[0], e[1]);t.push_back(e[0]);points.push_back(t);}vector<vector<int>> result;for (auto x: points) {int n = 1;vector<int> t;while (n < x.size()) {vector<int> m;m.assign(guanlian[0].size(), 0);m[x[n - 1]] = 1;m[x[n]] = 1;for (int i = 0; i < guanlian.size(); i++) {if (guanlian[i] == m) {t.push_back(i);break;}}n++;}result.push_back(t);}return result;
}bool liantong(vector<vector<int>> matrix) {vector<bool> visited;visited.assign(matrix.size(), false);visited[0] = true;queue<int> q;q.push(0);while (!q.empty()) {int now = q.front();q.pop();for (int i = 0; i < matrix.size(); i++) {if (matrix[now][i] == 1 && !visited[i]) {q.push(i);visited[i] = true;}}}for (auto x: visited) {if (!x) return false;}return true;
}vector<vector<int>>
geji(vector<vector<int>> xianglin, vector<vector<int>> guanlian, vector<unsigned int> bian) {vector<unsigned int> xian;for (int i = 0; i < guanlian.size(); i++) {if (!count(bian.begin(), bian.end(), i)) {xian.push_back(i);}}vector<vector<int>> result;for (auto x: bian) {vector<vector<int>> t(xianglin.begin(), xianglin.end());vector<int> e;for (int i = 0; i < guanlian[0].size(); i++) {if (guanlian[x][i] == 1) {e.push_back(i);}}t[e[0]][e[1]] = 0;t[e[1]][e[0]] = 0;vector<int> edge;edge.push_back(x);for (auto y: xian) {// 添加一条弦e.clear();for (int i = 0; i < guanlian[0].size(); i++) {if (guanlian[y][i] == 1) {e.push_back(i);}}t[e[0]][e[1]] = 1;t[e[1]][e[0]] = 1;if (liantong(t)) {edge.push_back(y);t[e[0]][e[1]] = 0;t[e[1]][e[0]] = 0;}}result.push_back(edge);}return result;
}vector<vector<int>> space(const vector<vector<int>> &circles) {vector<unsigned int> selected;vector<vector<int>> result;for (int i = 1; i < 1 << circles.size(); i++) {selected.clear();unsigned int x = i, place = 0;while (x) {if (x & 0x1) {selected.push_back(place);}x >>= 1;place++;}vector<int> t(circles[selected[0]].begin(), circles[selected[0]].end());selected.erase(selected.begin());for (auto e: selected) {for (auto each: circles[e]) {if (count(t.begin(), t.end(), each)) {for (auto it = t.begin(); it != t.end();) {if (*it == each) {it = t.erase(it);} else {it++;}}} else {t.push_back(each);}}}result.push_back(t);}return result;
}int main() {int n, t;cout << "请输入点的个数:" << endl;cin >> n;cout << "请输入矩阵" << endl;vector<vector<int>> m;for (int i = 0; i < n; i++) {vector<int> temp;for (int j = 0; j < n; j++) {cin >> t;temp.push_back(t);}m.push_back(temp);}vector<vector<int>> g = guanlianMatrix(m);cout << "关联矩阵为:" << endl << "   ";for (int i = 0; i < g.size(); i++) {cout << "e" << i << "\t";}cout << endl;for (int i = 0; i < g[0].size(); i++) {cout << "v" << i << "  ";for (auto &j: g) {cout << j[i] << "\t";}cout << endl;}cout << "共有" << treeNum(m) << "颗树" << endl;vector<vector<int>> xianglin, guanlian;vector<unsigned int> bian;tree(g, xianglin, guanlian, bian);cout << "生成树的相邻矩阵为:" << endl << "   ";for (int i = 0; i < xianglin.size(); i++) {cout << "v" << i << "\t";}cout << endl;for (int i = 0; i < xianglin[0].size(); i++) {cout << "v" << i << "  ";for (auto &j: xianglin) {cout << j[i] << "\t";}cout << endl;}cout << "生成树关联矩阵为:" << endl << "   ";for (auto x: bian) {cout << "e" << x << "\t";}cout << endl;for (int i = 0; i < guanlian[0].size(); i++) {cout << "v" << i << "  ";for (auto &j: guanlian) {cout << j[i] << "\t";}cout << endl;}cout << "基本回路系统为:" << endl << "{ ";vector<vector<int>> circle = loop(xianglin, g, bian);for (int i = 0; i < circle.size(); i++) {for (int j = 0; j < circle[i].size(); j++) {cout << "e" << circle[i][j];if (j == circle[0].size() - 1 && i != circle.size() - 1) cout << ", ";}}cout << " }" << endl;vector<vector<int>> huanlu = space(circle);cout << "环路空间为:" << endl << "{ Φ ,";for (int i = 0; i < huanlu.size(); i++) {for (int j = 0; j < huanlu[0].size(); j++) {cout << "e" << huanlu[i][j];if (j == huanlu[0].size() - 1 && i != huanlu.size() - 1) cout << ", ";}}cout << " }" << endl;cout << "基本割集系统为:" << endl << "{ ";vector<vector<int>> gj = geji(xianglin, g, bian);for (int i = 0; i < gj.size(); i++) {cout << "{ ";for (int j = 0; j < gj[i].size(); j++) {if (j == gj[i].size() - 1) {cout << "e" << gj[i][j] << " } ";if (i != gj.size() - 1) cout << ",";} else {cout << "e" << gj[i][j] << ",";}}}cout << " }" << endl;cout << "断集空间为:" << endl << "{ Φ ,";vector<vector<int>> dj = space(gj);for (int i = 0; i < dj.size(); i++) {cout << "{ ";for (int j = 0; j < dj[i].size(); j++) {if (j == dj[i].size() - 1) {cout << "e" << dj[i][j] << " } ";if (i != dj.size() - 1) cout << ",";} else {cout << "e" << dj[i][j] << ",";}}}cout << " }" << endl;system("pause");return 0;
}

OUC离散数学II实验二(Python+Cpp)相关推荐

  1. python语言基础实验_实验二Python语言基础函数包练习.doc

    实验二Python语言基础函数包练习 实验 Python语言基础函数包练习:1208 学号: 实验目的 1.Python语言包,如math.NumPySciPy和Matplotlib等函数包的使用实验 ...

  2. Quartus II实验二 运算部件实验:并行乘法器

    如果很多操作步骤忘记可以参考链接: Quartus II实验一 运算部件实验:加法器https://blog.csdn.net/qq_45037155/article/details/12420206 ...

  3. 实验二 Python流程控制

    一.实验目的 1.掌握分支条件语句的使用. 2.掌握分支嵌套语句的使用. 3. 掌握for.while循环语句及break,continue的使用 4. 掌握带else字句的循环语句的使用 5. 掌握 ...

  4. 实验二.Python 运算符与内置函数

    一.实验目的 1.熟练运用python运算符: 2.熟练运用Python内置函数. 二.实验环境 多媒体计算机  Windows 操作系统  Python3.7   三.实验内容及要求 (一).编写程 ...

  5. [笔记]搜索引擎-实验报告-实验二

    实验目的 掌握文本处理和分析的内容: 掌握文本预处理的基本技术 掌握倒排文档的实现 掌握向量空间模型的实现 掌握文本分类模型的实现 链接分析的内容: 掌握 PageRank 算法的原理和实现 实验步骤 ...

  6. 编译原理实验--实验二 递归下降法判断算术表达式的正确性--Python实现

    目录 一.实验目的和要求 二.实验内容 三.实验环境 四.实验步骤 1.语法分析所依据的文法: 2.给出消除左递归及提取左公因子的文法: 五.测试要求 六.实验步骤 1.语法分析所依据的文法 2.给出 ...

  7. python程序设计梁勇 百度网盘_20194220 2019-2020-2 《Python程序设计》实验二报告

    20194220 2019-2020-2 <Python程序设计>实验二报告 课程:<Python程序设计> 班级: 1942 姓名: 梁勇 学号:20194220 实验教师: ...

  8. python程序设计报告-20194115 实验二《Python程序设计》实验报告

    # 20194115 2019-2020-2 <Python程序设计>实验二报告 课程:<Python程序设计> 班级: 1941 姓名: 刘奕辉 学号:20194115 实验 ...

  9. python程序设计报告-20191206 实验二《Python程序设计》实验报告

    学号 2019-2020-2 <Python程序设计>实验二报告 课程:<Python程序设计> 班级: 1912 姓名: 陈发强 学号: 20191206 实验教师:王志强 ...

最新文章

  1. 【JOURNAL】恭喜发财
  2. seconds_behind_master监控复制推延的不足及pt-heartbeat改进方法
  3. python批处理栅格转点_python获取栅格点和面值的实现
  4. robotframework基础学习(8)
  5. 微信小程序 - 实践- 001-实现一个多TAB的菜单框架
  6. spark的异步消息总线LiveListenBus
  7. centos6.5 安装 OpenResty
  8. Java 中的抽象类和接口
  9. 运行catia_浅谈CATIA开发——CAA简介
  10. Python: hashlib库、sha256、md5
  11. 通达信插件模板 Purebasic版
  12. C#中check和uncheck
  13. 皇冠与锚-JS实现(拒绝赌博)
  14. 电脑如何做动态图 GIF表情包怎么制作
  15. yum search htppd 的意思
  16. 华为是ICT人才培养的“黑土地”,谁又是浇水人呢?
  17. workon 未找到命令
  18. document.forms[0].submit();和document.forms[0].action = ““;问题
  19. java路由总线_网易考拉Android客户端路由总线设计
  20. 5次史上最牛的黑客攻击、比电影还刺激

热门文章

  1. Python 进阶(七): Word 基本操作
  2. 计算机视觉与深度学习公司
  3. 自己解决个税申报的步骤
  4. 【luogu 3397】地毯 差分
  5. 频谱、功率谱、倒频谱
  6. linux 挂载以及初始化硬盘
  7. FCM公式详细推及代码
  8. 8个 Chatbot 框架介绍
  9. C++:求整数num中包含因子k的个数
  10. EasyClick 易点云测 IOS版自动化测试工具