实验主题
生成树、环路空间、断集空间的求解
实验目的
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}})。
1000多行的石山代码。。。 思路很简单的。
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 20;
class S {
public:
vector<vector<int>> adjMatrix;
vector<vector<int>> incMatrix;
vector<vector<int>> spanningTreeMatrix;
vector<vector<int>> spaAdjMatrix;
vector<vector<int>> spaIncMatrix;
int degree[maxn] = { 0 };
int edgeList[maxn] = { 0 };
int numOfSpanningTree;
int n=0;
int m = 0, m2 = 0;
bool eList[maxn];
S()
{
}
void readAdjMatrix()
{
cout << "读入邻接矩阵" << endl;
cout << "请输入顶点数" << endl;
cout << "n=" ;
cin >> n;
int input;
for (int i = 0; i <= n; i++)
{
vector<int> temp;
for (int j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
temp.push_back(-1);
else
{
cin >> input;
if (j < i && input)m++;
temp.push_back(input);
}
}
adjMatrix.push_back(temp);
}
}
void displayAdjMatrix(vector<vector<int>> matrix,int row,int col)
{
cout << "打印邻接矩阵" << endl;
for (int i = 0; i <= row; i++)
{
if (i == 0) {
printf("%-5s\t", "index");
}
else
printf("%4c%d\t", 'v', i);
for (int j = 1; j <= col; j++)
{
if (i == 0)
printf("%4c%d", 'v', j);
else
printf("%5d", matrix[i][j]);
}
cout << endl;
}
}
void constructIncMatrix(vector<vector<int>> matrix)
{
for (int i = 0; i <= n; i++)
{
vector<int> temp;
for (int j = 0; j <= m; j++)
{
temp.push_back(0);
}
incMatrix.push_back(temp);
}
int e = 0;
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
{
if (adjMatrix[i][j])
{
e++;
incMatrix[i][e] = 1;
incMatrix[j][e] = 1;
}
}
}
memset(eList, 1, maxn);
}
void displayIncMatrix(vector<vector<int>> matrix, int row, int col)
{
cout << "打印关联矩阵" << endl;
for (int i = 0; i <= row; i++)
{
if (i == 0) {
printf("%-5s\t", "index");
}
else
printf("%4c%d\t", 'v', i);
for (int j = 1; j <= col; j++)
{
if (!eList[j])continue;
if (i == 0)
printf("%4c%d", 'e', j);
else
printf("%5d", matrix[i][j]);
}
cout << endl;
}
}
//计算树矩阵行列式的值
int det(int n,vector<vector<int>> matrix)
{
int ret = 1;
for (int i = 2; i <= n; i++)
{
for (int j = i + 1; j <= n; j++) {
while (matrix[j][i])
{
int t = matrix[i][i] / matrix[j][i];
for (int k = i; k <= n; k++)
matrix[i][k] = (matrix[i][k] - matrix[j][k] * t);
for (int k = i; k <= n; k++)
swap(matrix[i][k], matrix[j][k]);
ret = -ret;
}
}
if (matrix[i][i] == 0)
return 0;
ret *= matrix[i][i];
}
if (ret < 0)
ret = -ret;
return ret;
}
void spanningTree()
{
for (int i = 0; i <= n; i++)
{
vector<int> temp;
for (int j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
temp.push_back(-1);
else temp.push_back(0);
}
spanningTreeMatrix.push_back(temp);
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (adjMatrix[i][j] == 1)degree[i]++;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) spanningTreeMatrix[i][j] = degree[i];
else spanningTreeMatrix[i][j] -= adjMatrix[i][j];
}
}
cout << "生成树有";
cout<<det(n, spanningTreeMatrix)<<"个" << endl;
}
void outOneSpanningTree(int x)
{
int count = 0;
for (int i = 0; i <= n; i++)
{
vector<int> temp;
for (int j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
temp.push_back(-1);
else temp.push_back(0);
}
spaAdjMatrix.push_back(temp);
}
for (int i = 1; i < maxn; i++)
vis[i] = 0;
DFS(x);
for (int i = 1; i < maxn; i++)
count += vis[i];
if (count == n)
{
displayAdjMatrix(spaAdjMatrix, n, n);
constructSpaIncMatrix();
}
}
int vis[maxn] = { 0 };
void DFS(int x)
{
vis[x] = 1;
for (int i = 0; i <=n; i++)
{
if (vis[i] == 0 && x != i &&adjMatrix[x][i]==1)
{
spaAdjMatrix[x][i] = spaAdjMatrix[i][x] = 1;
DFS(i);
break;
}
}
}
void constructSpaIncMatrix()
{
for (int i = 0; i <= n; i++)
{
vector<int> temp;
for (int j = 0; j <= m; j++)
{
if (i == 0 || j == 0)
temp.push_back(-1);
else temp.push_back(0);
}
spaIncMatrix.push_back(temp);
}
memset(eList, 0, maxn); eList[0] = 1;
int e = 0, counter = 1;
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
{
if (adjMatrix[i][j])
{
if (spaAdjMatrix[i][j])
{
eList[counter] = 1;
e++;
spaIncMatrix[i][e] = 1;
spaIncMatrix[j][e] = 1;
}
counter++;
}
}
}
displayIncMatrix(incMatrix, n, m);
}
vector<vector<int>> edge_c;
vector<int> tem;
int visited[maxn] = { 0 };
int space[maxn][maxn] = { 0 };
int cnt = 0;
void simpleCircuitSystem()
{
//对edge_c的初始化
for (int i = 0; i <= m; i++)
{
vector<int> temp;
for (int j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
temp.push_back(-1);
else temp.push_back(incMatrix[j][i]);
}
edge_c.push_back(temp);
}
for (int i = 1; i <= m; i++)
{
int a = 0;
int b = 0;
if (!eList[i])
{
for (int j = 1; j <= n; j++)
{
if (edge_c[i][j] == 1 && a==0)
{
a = j;
}
if (edge_c[i][j] == 1 && b == 0 && a!=j)
{
b = j;
}
}
DFS_1(b, a);
cout << "基本回路系统:";
for (int k = 0; k < tem.size()-1; k++)
{
//cout << tem[i] << tem[i + 1];
for (int j = 1; j <= m; j++)
{
//cout << edge_c[j][tem[i]] << tem[i] <<tem[i+1];
if (edge_c[j][tem[k]] == edge_c[j][tem[k + 1]] && edge_c[j][tem[k]] == 1)
{
space[cnt][j] = 1;
cout << "e" << j << ",";
}
}
}
tem.clear();
for (int i = 0; i < maxn; i++)
visited[i] = 0;
flag = false;
space[cnt][i] = 1;
cnt++;
cout << "e" << i;
cout << endl;
}
}
}
bool flag = false;
void DFS_1(int x,int a)
{
if (x == a)
{
flag = true;
tem.push_back(x);
return;
}
else if (x!=a&&visited[x] == 0&&!flag)
{
visited[x] = 1;
tem.push_back(x);
for (int j = 1; j <= m; j++)
{
for (int i=1; i <= n; i++)
{
if (edge_c[j][i] == 1 && edge_c[j][x] == 1 && eList[j] && x != i && x != a)
{
DFS_1(i, a);
break;
}
}
}
}
}
int cnt1 = cnt;//环路空间
void circuitSpace()
{
int cnt1 = cnt;
if (cnt1 >= 1)
{
if (cnt1 >= 2)
{
for (int i = 0; i < cnt1; i++)
{
for (int j = i + 1; j < cnt1; j++)
{
for (int k = 1; k <= m; k++)
{
if (space[i][k] != space[j][k])
{
space[cnt][k] = 1;
}
}
cnt++;
}
}
if (cnt1 >= 3)
{
for (int i = 0; i < cnt1; i++)
{
for (int j = i + 1; j < cnt1; j++)
{
for (int l = j + 1; l < cnt1; l++)
{
for (int k = 1; k <= m; k++)
{
if (space[i][k] != space[j][k] !=space[l][k])
{
space[cnt][k] = 1;
}
}
cnt++;
}
}
}
if (cnt1 >= 4)
{
for (int i = 0; i < cnt1; i++)
{
for (int j = i + 1; j < cnt1; j++)
{
for (int l = j + 1; l < cnt1; l++)
{
for (int o = l + 1; o < cnt1; o++)
{
for (int k = 1; k <= m; k++)
{
if (space[i][k] != space[j][k] != space[l][k]!=space[o][k])
{
space[cnt][k] = 1;
}
}
cnt++;
}
}
}
}
if (cnt1 >= 5)
{
for (int i = 0; i < cnt1; i++)
{
for (int j = i + 1; j < cnt1; j++)
{
for (int l = j + 1; l < cnt1; l++)
{
for (int o = l + 1; o < cnt1; o++)
{
for (int p = o + 1; o < cnt1; p++)
{
for (int k = 1; k <= m; k++)
{
if (space[i][k] != space[j][k] != space[l][k] != space[o][k]!=space[p][k])
{
space[cnt][k] = 1;
}
}
cnt++;
}
}
}
}
}
}
}
}
}
}
cout <<"环路空间" << endl;
cout << "{}" << endl;
for (int i = 0; i < cnt; i++)
{
for (int j = 1; j <= m; j++)
{
if (space[i][j] == 1)cout << "e" << j << ",";
}
cout << endl;
}
}
vector<vector<int>> edge_s;
vector<vector<int>> spaadjmatrix;
vector<vector<int>> tmpspa;
int count = 0;
void DFS_2(int x)
{
if (visited[x] == 0)
{
count++;
visited[x] = 1;
}
for (int i = 1; i <= n; i++)
{
if (tmpspa[x][i] == 1)
{
tmpspa[x][i] = tmpspa[i][x] = 0;
DFS_2(i);
}
}
}
int bridgeNum = 0;
int getBridgeNum()
{
bridgeNum = 0;
for (int i = 1; i <= m; i++)
{
if (eList[i] == 0)
bridgeNum++;
}
return bridgeNum;
}
int outcome[100][100] = { 0 };
int tmpoutcome[maxn][maxn] = { 0 };
int cnt0 = 0;
void simpleCutsetSystem()
{
cout << "基本割集系统" << endl;
for (int i = 1; i <= m; i++)
{
for (int i = 0; i <= n; i++)
{
vector<int> temp;
for (int j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
temp.push_back(-1);
else temp.push_back(adjMatrix[i][j]);
}
spaadjmatrix.push_back(temp);
}
bool eList1[maxn];
for (int k = 0; k < maxn; k++)
{
eList1[k] = eList[k];
}
if (eList1[i])
{
for (int i = 0; i <= m; i++)
{
vector<int> temp;
for (int j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
temp.push_back(-1);
else temp.push_back(incMatrix[j][i]);
}
edge_s.push_back(temp);
}
//eList1[i] = 0;
int a = 0;
int b = 0;
for (int j = 1; j <= n; j++)
{
if (edge_s[i][j] == 1 && a == 0)
{
a = j;
continue;
}
if (edge_s[i][j] == 1 && b == 0)
b = j;
}
//cout << a << b <<endl;
//先删除这条树枝
spaadjmatrix[a][b] = spaadjmatrix[b][a] = 0;
getBridgeNum();
if (bridgeNum >= 1)
{
for (int j = 1; j <= m; j++)
{
if (!eList1[j] && i != j)
{
int v1 = 0;
int v2 = 0;
for (int k = 1; k <= n; k++)
{
if (edge_s[j][k] == 1 && v1 == 0)
{
v1 = k;
continue;
}
if (edge_s[j][k] == 1 && v2 == 0)
v2 = k;
}
//cout << v1 << v2 << endl;
spaadjmatrix[v1][v2] = spaadjmatrix[v2][v1] = 0;
for (int i = 1; i <= n; i++)
visited[i] = 0;
count = 0;
//displayAdjMatrix(spaadjmatrix, n, n);
for (int i = 0; i <= n; i++)
{
vector<int> temp;
for (int j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
temp.push_back(-1);
else temp.push_back(spaadjmatrix[i][j]);
}
tmpspa.push_back(temp);
}
DFS_2(1);
tmpspa.clear();
//cout << count << endl;
if (count == n)
;
else
{
outcome[cnt0][j] = 1;
outcome[cnt0][i] = 1;
cnt0++;
}
spaadjmatrix[v1][v2] = spaadjmatrix[v2][v1] = 1;
}
}
if (bridgeNum >= 2)
{
for (int j = 1; j <= m; j++)
{
if (!eList1[j] && j != i)
{
int v1 = 0;
int v2 = 0;
for (int x = 1; x <= n; x++)
{
if (edge_s[j][x] == 1 && v1 == 0)
{
v1 = x;
continue;
}
if (edge_s[j][x] == 1 && v2 == 0)
v2 = x;
}
spaadjmatrix[v1][v2] = spaadjmatrix[v2][v1] = 0;
for (int k = j + 1; k <= m; k++)
{
if (!eList1[k] && j != k)
{
int v3 = 0;
int v4 = 0;
for (int x = 1; x <= n; x++)
{
if (edge_s[k][x] == 1 && v3 == 0)
{
v3 = x;
continue;
}
if (edge_s[k][x] == 1 && v4 == 0)
v4 = x;
}
//cout << v1 << v2 << endl;
spaadjmatrix[v3][v4] = spaadjmatrix[v4][v3] = 0;
for (int i = 1; i <= n; i++)
visited[i] = 0;
count = 0;
//displayAdjMatrix(spaadjmatrix, n, n);
for (int i = 0; i <= n; i++)
{
vector<int> temp;
for (int j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
temp.push_back(-1);
else temp.push_back(spaadjmatrix[i][j]);
}
tmpspa.push_back(temp);
}
DFS_2(1);
tmpspa.clear();
//cout << count << endl;
if (count == n)
;
else
{
outcome[cnt0][j] = 1;
outcome[cnt0][i] = 1;
outcome[cnt0][k] = 1;
cnt0++;
}
spaadjmatrix[v3][v4] = spaadjmatrix[v4][v3] = 1;
}
}
spaadjmatrix[v1][v2] = spaadjmatrix[v2][v1] = 1;
}
}
if (bridgeNum >= 3)
{
for (int j = 1; j <= m; j++)
{
if (!eList1[j])
{
int v1 = 0;
int v2 = 0;
for (int x = 1; x <= n; x++)
{
if (edge_s[j][x] == 1 && v1 == 0)
{
v1 = x;
continue;
}
if (edge_s[j][x] == 1 && v2 == 0)
v2 = x;
}
spaadjmatrix[v1][v2] = spaadjmatrix[v2][v1] = 0;
for (int k = j + 1; k <= m; k++)
{
if (!eList1[k])
{
int v3 = 0;
int v4 = 0;
for (int x = 1; x <= n; x++)
{
if (edge_s[k][x] == 1 && v3 == 0)
{
v3 = x;
continue;
}
if (edge_s[k][x] == 1 && v4 == 0)
v4 = x;
}
//cout << v1 << v2 << endl;
spaadjmatrix[v3][v4] = spaadjmatrix[v4][v3] = 0;
for (int l = k + 1; l <= m; l++)
{
if (!eList1[l])
{
int v5 = 0;
int v6 = 0;
for (int x = 1; x <= n; x++)
{
if (edge_s[l][x] == 1 && v5 == 0)
{
v5 = x;
continue;
}
if (edge_s[l][x] == 1 && v6 == 0)
v6 = x;
}
spaadjmatrix[v5][v6] = spaadjmatrix[v6][v5] = 0;
for (int i = 1; i <= n; i++)
visited[i] = 0;
count = 0;
//displayAdjMatrix(spaadjmatrix, n, n);
for (int i = 0; i <= n; i++)
{
vector<int> temp;
for (int j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
temp.push_back(-1);
else temp.push_back(spaadjmatrix[i][j]);
}
tmpspa.push_back(temp);
}
DFS_2(1);
tmpspa.clear();
//cout << count << endl;
if (count == n)
;
else
{
outcome[cnt0][j] = 1;
outcome[cnt0][i] = 1;
outcome[cnt0][k] = 1;
outcome[cnt0][l] = 1;
cnt0++;
}
spaadjmatrix[v5][v6] = spaadjmatrix[v6][v5] = 1;
}
}
spaadjmatrix[v3][v4] = spaadjmatrix[v4][v3] = 1;
}
}
spaadjmatrix[v1][v2] = spaadjmatrix[v2][v1] = 1;
}
}
if (bridgeNum >= 4)
{
for (int j = 1; j <= m; j++)
{
if (!eList1[j])
{
int v1 = 0;
int v2 = 0;
for (int x = 1; x <= n; x++)
{
if (edge_s[j][x] == 1 && v1 == 0)
{
v1 = x;
continue;
}
if (edge_s[j][x] == 1 && v2 == 0)
v2 = x;
}
spaadjmatrix[v1][v2] = spaadjmatrix[v2][v1] = 0;
for (int k = j + 1; k <= m; k++)
{
if (!eList1[k])
{
int v3 = 0;
int v4 = 0;
for (int x = 1; x <= n; x++)
{
if (edge_s[k][x] == 1 && v3 == 0)
{
v3 = x;
continue;
}
if (edge_s[k][x] == 1 && v4 == 0)
v4 = x;
}
//cout << v1 << v2 << endl;
spaadjmatrix[v3][v4] = spaadjmatrix[v4][v3] = 0;
for (int l = k + 1; l <= m; l++)
{
if (!eList1[l])
{
int v5 = 0;
int v6 = 0;
for (int x = 1; x <= n; x++)
{
if (edge_s[l][x] == 1 && v5 == 0)
{
v5 = x;
continue;
}
if (edge_s[l][x] == 1 && v6 == 0)
v6 = x;
}
spaadjmatrix[v5][v6] = spaadjmatrix[v6][v5] = 0;
for (int o = l + 1; o <= m; o++)
{
if (!eList1)
{
int v7 = 0;
int v8 = 0;
for (int x = 1; x <= n; x++)
{
if (edge_s[l][x] == 1 && v7 == 0)
{
v7 = x;
continue;
}
if (edge_s[l][x] == 1 && v8 == 0)
v8 = x;
}
spaadjmatrix[v7][v8] = spaadjmatrix[v8][v7] = 0;
for (int i = 1; i <= n; i++)
visited[i] = 0;
count = 0;
//displayAdjMatrix(spaadjmatrix, n, n);
for (int i = 0; i <= n; i++)
{
vector<int> temp;
for (int j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
temp.push_back(-1);
else temp.push_back(spaadjmatrix[i][j]);
}
tmpspa.push_back(temp);
}
DFS_2(1);
tmpspa.clear();
//cout << count << endl;
if (count == n)
;
else
{
outcome[cnt0][j] = 1;
outcome[cnt0][i] = 1;
outcome[cnt0][k] = 1;
outcome[cnt0][l] = 1;
outcome[cnt0][o] = 1;
cnt0++;
}
spaadjmatrix[v7][v8] = spaadjmatrix[v8][v7] = 1;
}
}
spaadjmatrix[v5][v6] = spaadjmatrix[v6][v5] = 1;
}
}
spaadjmatrix[v3][v4] = spaadjmatrix[v4][v3] = 1;
}
}
spaadjmatrix[v1][v2] = spaadjmatrix[v2][v1] = 1;
}
}
}
}
}
spaadjmatrix[a][b] = spaadjmatrix[b][a] = 1;
edge_s.clear();
}
}
}
}
void printOutcome()
{
int oe[maxn] = { 0 };
for (int i = 0; i < cnt0; i++)
{
for (int j = 0; j < cnt0; j++)
{
if (i != j)
{
int f = 0;
int g = 0;
for (int k = 1; k <= maxn; k++)
{
if (outcome[i][k] > outcome[j][k])f++;
else if(outcome[i][k] < outcome[j][k])g++;
}
//cout << f <<" " << g << endl;
if (f > 0&&g == 0)
{
oe[i] = 1;
}
}
}
}
for (int i = 0; i <= cnt0; i++)
{
outcome[i][0] = 1;
if (oe[i] == 1)outcome[i][0] = 0;
}
for (int i = 0; i <= cnt0; i++)
{
for (int j = 1; j < maxn; j++)
{
if (outcome[i][j] == 1 && outcome[i][0]==1)
cout << "e" << j <<",";
}
cout << endl;
}
}
void cutsetSpace()
{
int cnt1 = cnt0;
if (cnt1 >= 1)
{
if (cnt1 >= 2)
{
for (int i = 0; i < cnt1; i++)
{
for (int j = i + 1; j < cnt1; j++)
{
int flag = 0;
for (int k = 1; k <= m; k++)
{
if (outcome[i][k] != outcome[j][k] && outcome[i][0] && outcome[j][0])
{
outcome[cnt0][k] = 1;
outcome[cnt0][0] = 1;
flag = 1;
}
}
if(flag)
cnt0++;
}
}
if (cnt1 >= 3)
{
for (int i = 0; i < cnt1; i++)
{
for (int j = i + 1; j < cnt1; j++)
{
for (int l = j + 1; l < cnt1; l++)
{
int flag = 0;
for (int k = 1; k <= m; k++)
{
if (outcome[i][k] != outcome[j][k] != outcome[l][k] && outcome[i][0] && outcome[j][0] &&outcome[l][0])
{
outcome[cnt0][k] = 1;
outcome[cnt0][0] = 1;
flag = 1;
}
}
if (flag)
cnt0++;
}
}
}
if (cnt1 >= 4)
{
for (int i = 0; i < cnt1; i++)
{
for (int j = i + 1; j < cnt1; j++)
{
for (int l = j + 1; l < cnt1; l++)
{
for (int o = l + 1; o < cnt1; o++)
{
int flag = 0;
for (int k = 1; k <= m; k++)
{
if (outcome[i][k] != outcome[j][k] != outcome[l][k] != outcome[o][k] && outcome[i][0] && outcome[j][0] && outcome[l][0]&&outcome[o][0])
{
outcome[cnt0][k] = 1;
outcome[cnt0][0] = 1;
flag = 1;
}
}
if (flag)
cnt0++;
}
}
}
}
if (cnt1 >= 5)
{
for (int i = 0; i < cnt1; i++)
{
for (int j = i + 1; j < cnt1; j++)
{
for (int l = j + 1; l < cnt1; l++)
{
for (int o = l + 1; o < cnt1; o++)
{
for (int p = o + 1; p < cnt1; p++)
{
int flag = 0;
for (int k = 1; k <= m; k++)
{
if (outcome[i][k] != outcome[j][k] != outcome[l][k] != outcome[o][k] != outcome[p][k] && outcome[i][0] && outcome[j][0] && outcome[l][0] && outcome[o][0]&&outcome[p][0])
{
outcome[cnt0][k] = 1;
outcome[cnt0][0] = 1;
flag = 1;
}
}
if (flag)
cnt0++;
}
}
}
}
}
if (cnt1 >= 6)
{
for (int i = 0; i < cnt1; i++)
{
for (int j = i + 1; j < cnt1; j++)
{
for (int l = j + 1; l < cnt1; l++)
{
for (int o = l + 1; o < cnt1; o++)
{
for (int p = o + 1; p < cnt1; p++)
{
for (int q = p + 1; q < cnt1; q++)
{
int flag = 0;
for (int k = 1; k <= m; k++)
{
if (outcome[i][k] != outcome[j][k] != outcome[l][k] != outcome[o][k] != outcome[p][k] !=outcome[q][k] && outcome[i][0] && outcome[j][0] && outcome[l][0] && outcome[o][0] && outcome[p][0] && outcome[q][0])
{
outcome[cnt0][k] = 1;
outcome[cnt0][0] = 1;
flag = 1;
}
}
if (flag)
cnt0++;
}
}
}
}
}
}
}
}
}
}
}
}
cout << "断集空间" << endl;
int oe[10000] = { 0 };
for (int i = 0; i < cnt0; i++)
{
for (int j = 0; j < cnt0; j++)
{
if (j >= cnt1) outcome[j][0] = 1;
if (i != j && outcome[i][0] && outcome[j][0] )
{
for (int k = 1; k <= maxn; k++)
{
if (outcome[i][k] != outcome[j][k])
break;
}
//cout << f <<" " << g << endl;
oe[i] = i+1;
}
}
}
cout << "{";
cout << "{}" << endl;
int sum = 0;
for (int i = 0; i <= cnt0; i++)
{
int flag = 0;
for (int j = 1; j < maxn; j++)
{
if (outcome[i][j] == 1 && outcome[i][0] == 1 && oe[i] == i + 1)
{
cout << "e" << j << ",";
flag = 1;
}
}
if (flag)
{
sum++;
cout << endl;
}
}
cout << sum;
// cout << "}";
}
};
int main()
{
S s;
s.readAdjMatrix();
s.displayAdjMatrix(s.adjMatrix, s.n, s.n);
s.constructIncMatrix(s.adjMatrix);
s.displayIncMatrix(s.incMatrix, s.n, s.m);
s.spanningTree();
s.outOneSpanningTree(1);
s.simpleCircuitSystem();
s.circuitSpace();
s.simpleCutsetSystem();
s.printOutcome();
s.cutsetSpace();
}