一、图的存储结构的概述
一方面,由于图的结构比较复杂,任意两个顶点都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系,即图没有顺序存储结构,但其可以借助二维数组来表示元素之间的关系,即采用邻接矩阵表示法。
另一方面,由于图的任意两个顶点都可能存在关系,因此,用链式存储表示图是很自然的事,图的链式存储有多种,有邻接表、十字链表和邻接多重表,应根据实际需要的不同选择不同的存储结构。
二、四种邻接矩阵的c++代码实现
(一)无向无权图的邻接矩阵代码
- 设计思路:
两个顶点之间有边的话,记作1;无边的话,记作0
2.代码展示:
#include <bits/stdc++.h>
using namespace std;
const int maxn=100;
int mp[maxn][maxn];
int V,E;//记作顶点数为V;边数为E
int sx,ex;//记作起始点为sx,终点记作ex
int i,j;
int main(){
cin>>V>>E;
for(int i=0;i<E;i++){
cin>>sx>>ex;
mp[sx][ex]=1;
mp[ex][sx]=1;
}
for(int i=0;i<V;i++){
for(int j=0;j<V;j++){
cout<<mp[i][j];
cout<<" ";
}
cout<<endl;
}
return 0;
}
(二)有向无权图的邻接矩阵代码
1.设计思路:
在这里十分的简单扽进行设计,只需将一行代码进行注释
2.代码展示:
#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int mp[maxn][maxn];
int E,V;//V代表的是顶点数,而M代表的是边数
int sx,ex;//sx代表的是起点,而ex代表的是终点
int i,j;
int main(){
cin>>E>>V;
for(int i=0;i<E;i++){
cin>>sx>>ex;
mp[sx][ex]=1;
//mp[sx][ex]=//将此行代码进行注释
}
for(int i=0;i<E;i++){
for(int j=0;j<E;j++){
cout<<mp[i][j];
cout<<" ";
}
cout<<endl;
}
return 0;
}
(三)无向带权图的邻接矩阵代码
1.设计思路:
若两个顶点之间无线的话,记作为∞,两个定点之间有限的记作两个顶点的权值的大小。
2.代码展示:
#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int mp[maxn][maxn];
int V,E;//V为顶点的个数,而边的个数
int sx,ex,dis;//sx为起点,ex为终点,dis为两点之间的距离
int i,j;
int main(){
cin>>E>>V;
for(int i=0;i<E;i++){
cin>>sx>>ex>>dis;
mp[sx][ex]=dis;
mp[ex][sx]=dis;
}
for(int i=0;i<V;i++){
for(int j=0;j<V;j++){
if(mp[i][j]) cout<<mp[i][j];
else cout<<"∞";
cout<<" ";
}
cout<<endl;
}
return 0;
}
(四)有向带权图的邻接矩阵代码
1.设计思路:
只需将无向带权图的一行代码删除即可
#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int mp[maxn][maxn];
int V,E;//V是总的顶点数 ,E是总的边数
int sx,ex,dis;//sx为起点,ex为终点,dis为两点之间的距离
int i,j;
int main(){
cin>>V>>E;
for(int i=0;i<E;i++){
cin>>sx>>ex>>dis;
mp[sx][ex]=dis;
//mp[ex][sx]=dis;
}
for(int i=0;i<V;i++){
for(int j=0;j<V;j++){
if(mp[i][j]) cout<<mp[i][j];
else cout<<"∞";
cout<<" ";
}
cout<<endl;
}
return 0;
}