OUC离散数学II实验二C++之最“笨”方法

实验主题
生成树、环路空间、断集空间的求解

实验目的
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();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值