离散数学实验(八)判别图的连通性

实验目的及要求

1.通过算法设计并编程实现,使学生掌握利用计算机语言判别图的连通性的基本方法。

2.需要掌握的内容:给定 n 个结点的有向图的邻接矩阵,可判断该图是否为强连通的,单向连通 的,或弱连通的。

实验内容

对于给定的邻接矩阵 A,我们可以用前面给出的可达矩阵 Warshall 算法求 出 A 所表示的图的可达矩阵 P。对于可达矩阵 P 来说,如果 P 的所有元素均为 1, 则所给的有向图是强连通的;对于 P 的所有元素(除主对角线元素外)Pij 来说, 均有:Pij+Pji>0,则所给有向图是单向连通的。当所给有向图既不是强连通的, 又不是单向连通的时候,我们改造邻接矩阵为:对于矩阵 A 中所有的元素(除主 对角线的元素外)aij,若 aij=1 或 aji=1,则 1 Þ aij 且 1 Þ aji。对于这样改造之后 所得到的新的矩阵 A’(A’相当于原有向图忽略方向之后所得到的无向图的邻 接矩阵),再用前面所述的方法进行判断,当 P’的所有元素(除主对角线的元 素外)均为 1 时,原有向图是弱连通图;否则,原有向图是不连通的。

编程要求

给定 n 个结点的有向图的邻接矩阵,可判断该图是否为强连通的,单向连通 的,或弱连通的

测试数据

4
0 1 0 0
0 0 1 1
1 1 0 1
1 0 0 0

#include<iostream>
using namespace std;
int main()
{
	int p[50][50];
	int a[50][50];
	int i, j, k, m, n;
	cout << "输入结点个数:" << endl;
	cin >> n;
	cout << "输入邻接矩阵:" << endl;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			cin >> a[i][j];
		}
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			p[i][j] = a[i][j];
		}
	}
	//Warshall 算法
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (p[j][i] == 1)
			{
				for (k = 0; k < n; k++)
				{
					p[j][k] = p[j][k] + p[i][k];
					if (p[j][k] != 0)
					{
						p[j][k] = 1;
					}
				}
			}
		}
	}

	int cnt = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (p[i][j] == 1)
			{
				cnt++;
			}
		}
	}
	if (cnt == n * n)
	{
		cout << "强连通性" << endl;
	}
	cnt = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (i==j)
			{
				break;
			}
			if (p[i][j] + p[j][i] > 0)
			{
				cnt++;
			}
		}
	}
	if (2*cnt == (n * n-n))
	{
		cout << "单侧连通性" << endl;
	}
	//改造矩阵
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (a[i][j] == 1 || a[j][i] == 1)
			{
				a[i][j] = 1;
				a[j][i] = 1;
			}
		}
	}


	cnt = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (i == j)
			{
				break;
			}
			if (a[i][j] ==1)
			{
				cnt++;
			}
		}
	}
	if (2*cnt == (n * n - n))
	{
		cout << "弱连通性" << endl;
	}
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值