【邻接矩阵】 & 【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

相关推荐
地平线开发者3 小时前
profiler debug 工具用法与高一致性策略
算法·自动驾驶
编程大师哥3 小时前
匿名函数 lambda + 高阶函数
java·python·算法
isyangli_blog3 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008113 小时前
FastAPI APIRouter
开发语言·python
Benszen3 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆3 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木4 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
我叫袁小陌4 小时前
算法解题思路指南
算法
MC皮蛋侠客4 小时前
C++17 多线程系列(五):C++17 并行算法——从串行到并行的零成本迁移
c++·多线程
地平线开发者4 小时前
Conv+BN+Add+ReLU 融合机制简介
算法·自动驾驶