OUC离散数学II实验二(Python+Cpp)
实验主题
生成树、环路空间、断集空间的求解
实验目的
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)相关推荐
- python语言基础实验_实验二Python语言基础函数包练习.doc
实验二Python语言基础函数包练习 实验 Python语言基础函数包练习:1208 学号: 实验目的 1.Python语言包,如math.NumPySciPy和Matplotlib等函数包的使用实验 ...
- Quartus II实验二 运算部件实验:并行乘法器
如果很多操作步骤忘记可以参考链接: Quartus II实验一 运算部件实验:加法器https://blog.csdn.net/qq_45037155/article/details/12420206 ...
- 实验二 Python流程控制
一.实验目的 1.掌握分支条件语句的使用. 2.掌握分支嵌套语句的使用. 3. 掌握for.while循环语句及break,continue的使用 4. 掌握带else字句的循环语句的使用 5. 掌握 ...
- 实验二.Python 运算符与内置函数
一.实验目的 1.熟练运用python运算符: 2.熟练运用Python内置函数. 二.实验环境 多媒体计算机 Windows 操作系统 Python3.7 三.实验内容及要求 (一).编写程 ...
- [笔记]搜索引擎-实验报告-实验二
实验目的 掌握文本处理和分析的内容: 掌握文本预处理的基本技术 掌握倒排文档的实现 掌握向量空间模型的实现 掌握文本分类模型的实现 链接分析的内容: 掌握 PageRank 算法的原理和实现 实验步骤 ...
- 编译原理实验--实验二 递归下降法判断算术表达式的正确性--Python实现
目录 一.实验目的和要求 二.实验内容 三.实验环境 四.实验步骤 1.语法分析所依据的文法: 2.给出消除左递归及提取左公因子的文法: 五.测试要求 六.实验步骤 1.语法分析所依据的文法 2.给出 ...
- python程序设计梁勇 百度网盘_20194220 2019-2020-2 《Python程序设计》实验二报告
20194220 2019-2020-2 <Python程序设计>实验二报告 课程:<Python程序设计> 班级: 1942 姓名: 梁勇 学号:20194220 实验教师: ...
- python程序设计报告-20194115 实验二《Python程序设计》实验报告
# 20194115 2019-2020-2 <Python程序设计>实验二报告 课程:<Python程序设计> 班级: 1941 姓名: 刘奕辉 学号:20194115 实验 ...
- python程序设计报告-20191206 实验二《Python程序设计》实验报告
学号 2019-2020-2 <Python程序设计>实验二报告 课程:<Python程序设计> 班级: 1912 姓名: 陈发强 学号: 20191206 实验教师:王志强 ...
最新文章
- 解决maven无法下载jar的问题
- mysql安全无密码登录_技术分享 | 安全地无密码登录 MySQL
- 【调参实战】如何开始你的第一个深度学习调参任务?不妨从图像分类中的学习率入手。...
- CSS3的background-size:设置背景图片大小
- java实现https免证书认证
- WORD文档的超链接无法打开——“由于本机的限制该操作已被取消”的解决方法
- python程序启动其他python程序,如何使用Python启动应用程序的实例?
- 怎么将一个数字高低位互换_多彩数字 多彩童年——东城幼儿园玩具研究教学案例...
- 主要编程教学语言的讨论
- 个人计算机主板的组成部分,简述计算机主板的基本组成部分
- Introduction to Computer Networking学习笔记(二十九):DHCP
- Windows11快捷键大全 win11常用快捷键介绍
- 计算机应用基础教案 电子书,计算机应用基础教案(全套)-20210511075659.pdf-原创力文档...
- 软件测试工具有哪些(软件测试常用的工具都有哪些)
- html5 报表erp案例,SpreadJS 纯前端表格控件应用案例:集成 Odoo 提升企业ERP表格功能...
- 一文详解synchronized与volatile
- Flutter 使用Texture实现Windows渲染视频
- Unity3D使用LitJson.dll解析报错问题
- 蓝桥杯java历年真题及答案整理(共100道题目及答案)
- html idv垂直居中,1.2.7 Excel表格打印技巧