实验一 (一)实验题目 可图化、可简单图化、连通性的判别及图的矩阵表达
(二)实验目的 1、 掌握可图化的定义及判断方法;
2、 掌握可简单图化的定义及判断方法;
3、 掌握连通图的判断方法;
4、 掌握图的矩阵表达。
(三)实验要求 1、 给定非负整数序列(例如:(4,2,2,2,2))。
2、 判断此非负整数序列是否是可图化的。
3、 请利用Havel定理判断此非负整数序列是否是可简单图化的,要求输出判断过程与结果。
4、 如果是可简单图化的,请输出该序列对应一个简单图的相邻矩阵,并判断该图是否连通。
(四)实验内容和实验步骤 1、需求分析
(1) 输入的形式和输入值的范围:
输入形式:例如4,2,2,2,2(可给定任意数量的序列)
输入值的范围:非负整数
(2) 输出的形式:
(3) 程序所能实现的功能:
能通过输入任意个数的非负整数序列判断是否可图化,是否可简单图化,并输出相邻矩阵和判断是否连通
可循环,反复输入,方便测试多组数据
2、 概要设计
3、详细设计
Python: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 def Graphitization (array ): sum = 0 for i in range (len (array)): sum += array[i] if sum % 2 == 0 and sum != 0 : return True return False def Graphitization_simple (array ): a = sorted (array, reverse=True ) if a[0 ] >= len (array): print ("但不满足n-1>=d1" ) return False string = '(' for i in range (len (a)): if i != len (a)-1 : string += str (a[i]) + ',' else : string += str (a[i]) print (string+')可简单图化?' ) while True : head = a.pop(0 ) for i in range (head): a[i] -= 1 a = sorted (a, reverse=True ) string = '⇔(' for i in range (len (a)): if i != len (a) - 1 : string += str (a[i]) + ',' else : string += str (a[i]) print (string + ')可简单图化' ) if a.count(0 ) == len (a): return True if a.count(1 ) == 1 and a.count(0 ) == len (a)-1 : return False for i in range (len (a)): if a[i] < 0 : return False def sort_two (a ): for i in range (len (a[0 ])): for j in range (i, len (a[0 ])): if a[0 ][i] < a[0 ][j]: a[0 ][i], a[0 ][j] = a[0 ][j], a[0 ][i] a[1 ][i], a[1 ][j] = a[1 ][j], a[1 ][i] def Adjacency_matrix (array, m ): a = [[0 ] * len (array) for _ in range (2 )] a[0 ] = sorted (array, reverse=True ) for i in range (len (array)): a[1 ][i] = i for i in range (len (array)): for j in range (len (array)): for k in range (len (array)): if a[1 ][k] == i and a[0 ][k] > 0 and a[0 ][j] > 0 and i < a[1 ][j]: m[i][ a[1 ][j] ] = 1 m[ a[1 ][j] ][i] = 1 a[0 ][j] -= 1 a[0 ][k] -= 1 sort_two(a) print ("其相邻矩阵为:" ) for i in range (len (array)): for j in range (len (array)): print (m[i][j], end=' ' ) print () def Connected (m ): def dfs (node ): visited[node] = True for neighbor, has_edge in enumerate (m[node]): if has_edge and not visited[neighbor]: dfs(neighbor) n = len (m) visited = [False ] * n dfs(0 ) return all (visited) while True : cin = input ("请输入非负整数序列(用逗号分隔),输入0结束: " ) if cin == '0' : break try : array = list (map (int , cin.split(',' ))) m = [ [0 for _ in range (len (array))] for _ in range (len (array)) ] if Graphitization(array): print ("该序列“可图化”" ) if Graphitization_simple(array): print ("故:该序列“可简单图化”" ) Adjacency_matrix(array, m) if Connected(m): print ("且该图是“连通”的" ) else : print ("且该图是“不连通”的" ) else : print ("故:该序列“不可简单图化”" ) else : print ("该序列“不可图化”" ) print () except ValueError: print ("输入错误!请确保输入为非负整数序列,并使用逗号分隔。" )
C++: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 #include <iostream> using namespace std; int n, nn, a[100 ]={0 }, b[2 ][100 ] = {0 }, array[100 ]={0 }, m[100 ][100 ]={0 };void sort1 () { for (int i=0 ; i<nn; i++) { for (int j=i; j<nn; j++) { if (a[i] < a[j]) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } } } } void sort2 () { for (int i=0 ; i<n; i++) { for (int j=i; j<n; j++) { if (b[0 ][i] < b[0 ][j]) { int temp = b[0 ][i]; b[0 ][i] = b[0 ][j]; b[0 ][j] = temp; temp = b[1 ][i]; b[1 ][i] = b[1 ][j]; b[1 ][j] = temp; } } } } bool Graphitization () { int sum = 0 ; for (int i=0 ; i<n; i++) sum += array[i]; if ( sum%2 == 0 ) return true ; return false ; } int count (int num) { int sum = 0 ; for (int i=0 ; i<nn; i++) { if (a[i] == num) sum++; } return sum; } bool Graphitization_simple () { sort1 (); if (a[0 ] >= n) { cout << "不满足n-1>=d1" << endl; return false ; } cout << "(" ; for (int i=0 ; i<n; i++) { if (i != n-1 ) cout << a[i] << "," ; else cout << a[i]; } cout << ")可简单图化" << endl; while (1 ) { int head = a[0 ]; for (int i=0 ; i<nn-1 ; i++) a[i] = a[i+1 ]; nn--; a[nn]=0 ; for (int i=0 ; i<head; i++) a[i]--; sort1 (); cout << "<=>(" ; for (int i=0 ; i<n; i++) { if (i != n-1 ) cout << a[i] << "," ; else cout << a[i]; } cout << ")可简单图化" << endl; if (count (0 ) == nn) return true ; if (count (1 ) == 1 && count (0 ) == nn-1 ) return false ; for (int i=0 ; i<nn; i++) { if (a[i] < 0 ) return false ; } } } void Adjacency_matrix () { for (int i=0 ; i<n; i++) a[i] = array[i]; sort1 (); for (int i=0 ; i<n; i++) { b[0 ][i] = a[i]; b[1 ][i] = i; } for (int i=0 ; i<n; i++) { for (int j=0 ; j<n; j++) { for (int k=0 ; k<n; k++) { if (b[1 ][k]==i && b[0 ][k]>0 && b[0 ][j]>0 && i<b[1 ][j]) { m[i][b[1 ][j]] = 1 ; m[b[1 ][j]][i] = 1 ; b[0 ][j]--; b[0 ][k]--; } } } sort2 (); } cout << "其相邻矩阵为:" << endl; for (int i=0 ; i<n; i++) { for (int j=0 ; j<n; j++) { cout << m[i][j] << " " ; } cout << endl; } } void dfs (bool visited[], int node) { visited[node] = true ; for (int neighbor = 0 ; neighbor < n; ++neighbor) { if (m[node][neighbor] == 1 && !visited[neighbor]) { dfs (visited, neighbor); } } } bool Connected () { bool visited[n] = {false }; dfs (visited, 0 ); for (int i = 0 ; i < n; ++i) { if (!visited[i]) { return false ; } } return true ; } int main () { while (1 ) { cout << "请输入个数n:(输入0退出)" << endl; cin >> n; nn = n; if (n==0 ) break ; for (int i=0 ; i<n; i++) cin >> array[i]; for (int i=0 ; i<n; i++) a[i] = array[i]; for (int i=0 ; i<100 ; i++) { for (int j=0 ; j<100 ; j++) { m[i][j] = 0 ; } } if (Graphitization ()) { cout << "该序列可图化" << endl; if (Graphitization_simple ()) { cout << "故该序列可简单图化" << endl; Adjacency_matrix (); if (Connected ()) cout << "且该图是连通的" << endl; else cout << "且该图是不连通的" << endl; } else cout << "故该序列不可简单图化" << endl; } else cout << "该序列不可图化" << endl; cout << endl; } return 0 ; }
4、调试分析
(1)调试过程中所遇到的问题及解决方法:
判断可图化时未考虑到全0的情况导致出错
解决方法:将sum!=0
加入if判断
判断可简单图化时未考虑到n-1≥d1
的情况
解决方法:已添加
判断连通时未熟练掌握DFS
解决方法:通过网上的素材借鉴理解学习
(2)算法的时空分析:
Graphitization(array)
时间复杂性:
算法中的循环次数与输入数组的长度成正比,因此时间复杂性为 O(n)。
空间复杂性:
仅使用常量级别的额外空间,因此空间复杂性为 O(1)。
Graphitization_simple(array)
时间复杂性:
算法中的排序操作为 O(n log n),其中 n 为数组的长度。
主循环的时间复杂性主要取决于排序操作,因此总体时间复杂性为 O(n log n)。
空间复杂性:
除了输入数组外,仅使用了常量级别的额外空间,因此空间复杂性为 O(1)。
sort_two(a)
时间复杂性:
该算法是选择排序,时间复杂性为 O(n^2),其中 n 为二维列表中的列数。
空间复杂性:
仅使用常量级别的额外空间,因此空间复杂性为 O(1)。
Adjacency_matrix(array, m)
时间复杂性:
该算法中的主循环中包含排序和嵌套循环,因此时间复杂性可能高达 O(n^3),其中 n 为数组的长度。
空间复杂性:
除了输入数组和邻接矩阵外,仅使用了常量级别的额外空间,因此空间复杂性为 O(n^2)。
Connected(m)
时间复杂性:
深度优先搜索的时间复杂性为 O(V + E),其中 V 为节点数,E 为边数。在这里,E 的最坏情况可能是 O(n^2),因此总体时间复杂性为 O(n^2)。
空间复杂性:
除了输入的邻接矩阵和递归调用栈,仅使用了常量级别的额外空间,因此空间复杂性为 O(n)。
总体时空复杂性:
这里的分析是基于每个算法的最坏情况。
实际性能可能会受到不同输入情况的影响。
(五)实验结果
(六)实验总结
参考文献:离散数学II实验一 : 白