邻接矩阵

邻接矩阵

0. 邻接矩阵

  • 邻接矩阵相比于上一篇博客邻接表的讲解要简单得多
  1. 数据结构,如果将二维数组 $g$ 定义为全局变量,那默认初始化应该为 $0$ ,如果题目中存在自环,可以做特判,$memset$ 初始化数组 $g$ 为 $0x3f3f3f3f$ 表示无穷大,$0$ 表示自环
1
2
3
// 邻接矩阵
int d[N]; // 存储每个顶点的度
int g[N][N]; // 邻接矩阵
  1. 以下模板是无向图的邻接矩阵模板,如果改成有向图,和邻接表一样,不需要对称建边,比如有一条边是 $(1,3)$,则 $d[1]++,\ g[1][3]=1 $ 即可
1
2
3
4
5
6
7
8
// 输入边
while(m--) {
int u,v;
scanf("%d%d",&u,&v);
// 邻接矩阵建边
d[u]++,d[v]++; // 顶点u和顶点v度数+1
g[u][v]=1,g[v][u]=1; // 互相可达,为0表示不可达(如果题目涉及自环可用memset初始化为0x3f3f3f3f表示不可达)
}
  • 完整代码如下,注意代码采用无向图模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<bits/stdc++.h>
#define x first
#define y second

using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

// 解题思路: 图的存储-邻接矩阵

const int N=1e3+5;
const int M=(1e5+5)*2; // 无向图建边最大边数为题目最大边数*2

// 邻接矩阵
int d[N]; // 存储每个顶点的度
int g[N][N]; // 邻接矩阵

int main() {
// 假设题目编号默认从1开始
int n,m; // 存储顶点数和边数
// 输入边
while(m--) {
int u,v;
scanf("%d%d",&u,&v);
// 邻接矩阵建边
d[u]++,d[v]++; // 顶点u和顶点v度数+1
g[u][v]=1,g[v][u]=1; // 互相可达,为0表示不可达(如果题目涉及自环可用memset初始化为0x3f3f3f3f表示不可达)
}
// 输出邻接矩阵
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
cout<<g[i][j]<<' ';
}
cout<<endl;
}
return 0;
}

1. 洛谷3643 图的存储

题目链接:B3643 图的存储 - 洛谷

image-20240309115736673

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<bits/stdc++.h>
#define x first
#define y second

using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

// 解题思路:

const int N=1e3+10; // 最大顶点
const int M=(1e5+10)*2; // 最大边数

int n,m; // 顶点数和边数
int u,v;

// 邻接矩阵
int d[N]; // 存度数
int g[N][N]; // 邻接矩阵

// 邻接表
int h[N]; // h[i]:编号i的顶点的
int ne[M];
int e[M];
int idx; // 建树因子

// 链式前向星(头插法)
void add(int a,int b) {
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

int main() {
cin>>n>>m;
memset(h,-1,sizeof h); // 初始化
while(m--) {
scanf("%d%d",&u,&v);
// 邻接矩阵建边
d[u]++,d[v]++; // 度数+1
g[u][v]=1,g[v][u]=1; // 互达
// 邻接表建边
add(u,v);
add(v,u);
}
// 遍历邻接矩阵
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
cout<<g[i][j]<<' ';
}
cout<<endl;
}
// 遍历邻接表
for(int i=1;i<=n;i++) {
cout<<d[i]<<' '; // 先输出点i的度数
vector<int> s;
for(int j=h[i];j!=-1;j=ne[j]) {
int t=e[j];
s.push_back(t);
}
// 编号从小到大排序
sort(s.begin(),s.end());
for(auto t:s) cout<<t<<' ';
cout<<endl;
}
return 0;
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2024 John Doe
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信