文章目录
邻接矩阵
邻接矩阵只适用于没有重边
(或重边可以忽略
)的情况
其最显著的优点
是可以 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