OUC离散数学II实验三C++

实验三  平面图判定及对偶图的求解

实验目的:

  1. 了解平面图的定义及其判定算法;
  2. 掌握平面图的对偶图的求解方法;
  3. 掌握平面图与其对偶图之间的点、面和边的关系;

实验要求

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

给定平面图此图的面矩阵,即Mr=(mij)r×m ,

mij=1ejRi的边界0ej不是Ri的边界

  1. 输出此平面图的顶点数n、边数m和面数r。
  2. 输出此平面图的对偶图的顶点数n*、边数m*和面数r*。
  3. 输出此平面图的对偶图的关联矩阵或邻接矩阵。

实验内容和步骤

  1. 根据输入的面矩阵(先输入行数和列数),利用欧拉公式

n = 2 + m - r; 这里指出输入的图仅有一个连通分支即本身。

可以直接求出顶点数N。

  1. 根据对偶图(dual)的性质可以得知,dual_n == r; dual_m == m; dual_r == n;

可以直接给出对偶图的三个属性

  1. 输出对偶图的关联矩阵

平面图的面矩阵实际上是对偶图的关联矩阵,我们把每一条相邻边转换成关联矩阵点与点的连接即可得到相邻矩阵。

最后直接输出即可

实验结果:实验结果(包括输入与输出形式如下所示)

结果截图:

下面附上源码

实验三  平面图判定及对偶图的求解
实验目的:
	了解平面图的定义及其判定算法;
	掌握平面图的对偶图的求解方法;
	掌握平面图与其对偶图之间的点、面和边的关系;
实验要求
给定一无向简单连通图的相邻矩阵(例如:A=   [█(0   1   1   1@1   0   0   1@1   0   0   1@1   1   1   0)])。
给定平面图此图的面矩阵,即Mr=〖(m_ij)〗_(r×m),
m_ij={■(■(1&e_j 是R_i 的边界)@■(0&e_j 不是R_i 的边界))┤
	输出此平面图的顶点数n、边数m和面数r。
	输出此平面图的对偶图的顶点数n*、边数m*和面数r*。
	输出此平面图的对偶图的关联矩阵或邻接矩阵。
实验内容和步骤
	根据输入的面矩阵(先输入行数和列数),利用欧拉公式
n = 2 + m - r; 这里指出输入的图仅有一个连通分支即本身。
可以直接求出顶点数N。
 
	根据对偶图(dual)的性质可以得知,dual_n == r; dual_m == m; dual_r == n;
可以直接给出对偶图的三个属性
 

	输出对偶图的关联矩阵
平面图的面矩阵实际上是对偶图的关联矩阵,我们把每一条相邻边转换成关联矩阵点与点的连接即可得到相邻矩阵。 

最后直接输出即可
 
实验结果:实验结果(包括输入与输出形式如下所示)
结果截图:
 
 

实验总结:
总的来说,这次实验难度较低,是对基本概念 定理的一个简单应用包括平面图,对偶图,欧拉公式,在此基础上,利用vector作为储存数组的容器,和之前实验一,二中对矩阵的一系列操作可以很快实现所需功能。这次实验,加深了我对平面图的理解,对对偶图,欧拉公式这类的定义,定理的记忆。同时提高了我对一些C++中数据结构的使用的能力,提升了解决问题与编程的能力。

下面附上源码
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    
    int r = 0; 
    int m = 0; 
    int n = 0;
    vector<vector<int> > Matrix;
    cout <<"输入面矩阵的行数和列数:";

    cin >> r >> m;

    for (int i = 0; i < r; ++i) {
        vector<int> tmp;
        int t = 0;
        for (int j = 0; j < m; ++j) {
            cin >> t;
            tmp.push_back(t);
        }
        Matrix.push_back(tmp);
    }

    // 欧拉公式
    n = 2 + m - r;
    cout << "n=" << n << " m=" << m << " r=" << r << endl;

    int dn = r; 
    int dm = m; 
    int dr = n; 

    cout << "n*=" << dn << " m*=" << dm << " r*=" << dr << endl;
    // 输出此平面图的相邻矩阵
    // 平面图的面矩阵就是对偶图的关联矩阵
    vector<vector<int> > dual_incMatrix(r, vector<int>(r, 0));
    for (int j = 0; j < m; ++j) 
    {
        int t1 = -1; 
        int t2 = -1;
        for (int i = 0; i < r; ++i) 
        {
            if (Matrix[i][j] != 0)
            {
                if (t1 == -1) 
                {
                    t1 = i;
                }
                else if (t2 == -1) 
                {
                    t2 = i;
                }
                else 
                {
                    cout << "出错了,一条边最多只能关联2个顶点!" <<endl;
                    return 0;
                }
            }
        }
        if (t2 == -1)  // 说明有环
        { 
            t2 = t1;
        }
        dual_incMatrix[t1][t2] = 1;
        dual_incMatrix[t2][t1] = 1;

    }

    cout <<"输出该平面图的对偶图的相邻矩阵A:" <<endl;

    for (int i = 0; i < dn; ++i) 
    {
        for (int j = 0; j < dn; ++j) 
        {
            if (i == j) 
            {
                dual_incMatrix[i][j] >>= 1;
            }
           cout << dual_incMatrix[i][j] <<" ";
        }
        cout << endl;
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值