【邻接矩阵】 & 【AT-ABC343-B】

文章目录

邻接矩阵

邻接矩阵只适用于没有重边(或重边可以忽略)的情况

其最显著的优点是可以 O ( 1 ) O(1) O(1) 查询一条边是否存在

由于邻接矩阵在稀疏图上效率很低(尤其是在点数较多的图上,空间无法承受),所以一般只会在稠密图上使用邻接矩阵

PS:一般在 n ≤ 1000 n\leq1000 n≤1000时使用邻接矩阵,其他可使用详见我的另一篇博文:链式前向星

邻接矩阵的时间复杂度

查询是否存在某条边: O ( 1 ) O(1) O(1)

遍历一个点的所有出边: O ( n ) O(n) O(n)

遍历整张图: O ( n 2 ) O(n^2) O(n2)

空间复杂度: O ( n 2 ) O(n^2) O(n2)

邻接矩阵的存储方式

有向图 :将a[i][j]赋值为1,代表第i个点到第j个点之间有一条边

无向图 :将a[i][j]赋值为1,将a[j][i]赋值为1,代表第i个点与第j个点之间有一条边

邻接矩阵详细解析

假定样例:

cpp 复制代码
6
1 2
3 4
2 4
1 5
1 4
3 3

领接矩阵code↓

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+50;
int n;
int a[maxn][maxn];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		a[x][y]=1;
//		a[y][x]=1;//如果是无向图则启用
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

如果是有向图,则输出如下图

如果是无向图,则输出如下图

可以看出,他是沿对角线(蓝色这条线,如果在线上的则不变)对称的

Atcoder例题【ABC343-B】

题目链接:Atcoder例题【ABC343-B】

题目以及题意解析

题意:给出一个矩阵,按升序打印与顶点i直接相连的顶点的个数

题目解析:只需要将这个矩阵当成邻接矩阵进行输入,然后依次 O ( n ) O(n) O(n)遍历即可

code↓

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+50;//边界
int n;//n*n的矩阵
int a[maxn][maxn];//定数组的边界,边界为maxn
int main(){
	cin>>n;//输入的是一个n*n的矩阵
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];//输入邻接矩阵,如果a[i][j]=1,那么代表i与j直接有边连接
			a[j][i]=a[i][j];//因为是无向图,而他们是对称的,所以需要倒过来再赋值一遍
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j]==1) cout<<j<<" ";//如果他们直接相连,则输出直接相连的这一个点的编号
		}
		cout<<endl;//输出格式
	}
	return 0;
}

此做法已AC

完结撒花QWQ

相关推荐
2601_9628857230 分钟前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
mmmmath_335 分钟前
二叉树の递归遍历
算法
爱吃奥利奥_wen1 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
All for pursuit.1 小时前
【位运算-1】338.比特位计数
数据结构·c++·算法·leetcode
我可能是个假开发1 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
小师兄吃牛肉2 小时前
C语言中的nullptr有必要吗
c语言·c++·算法
WL学习笔记2 小时前
日期类(C++)
开发语言·c++·日期类实现
谢亮_vipxieliang3 小时前
Go map与结构体的正确使用
开发语言·golang·哈希算法
H.莓飛3 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
一只小小的芙厨3 小时前
【线性DP】
学习·算法·动态规划