定义:表示顶点之间相邻关系的矩阵设G(V,E)是具有n个结点的图,则G得邻接矩阵是具有如下性质的方阵:
算法思想:
- 输入总顶点数和总边数。
- 依次输入点的信息存入顶点表中。
- 初始化邻接矩阵,使每个权值初始化为极大值。
- 构造邻接矩阵。
优点:
- 便于判断两个顶点之间是否有边;
- 便于计算各个顶点的度;
缺点:
- 不便于增加和删除顶点;
- 不便于统计边的数目;
- 空间复杂度高;
代码实现:
//使用邻接矩阵存储
#include <iostream>
#include <iomanip>
using namespace std;
#define MVNUM 100//最大顶点数
#define MaxInt 32767 //表示极大值 ∞
typedef char VerTexType;//设置顶点数据类型为char
typedef int ArcType; //设置边的权值类型为整型
//邻接矩阵结构体
typedef struct
{
VerTexType vexs[MVNUM]; //顶点表
ArcType arcs[MVNUM][MVNUM];//邻接矩阵表
int vexnum,arcnum; //顶点数 边数
} AMGraph;
int LocateVex(AMGraph g,VerTexType vex){
for (int i=0;i<=g.vexnum;++i){
if(vex==g.vexs[i]){
return i;
}
}
return -1;
}
//创建邻接矩阵
void CreateUDN(AMGraph &g){
cout<<"请输入顶点个数与边数";
cin>>g.vexnum>>g.arcnum;
cout<<"请输入顶点(每输入一个回车一次)";
for(int i = 0;i<g.vexnum;++i){
cin>>g.vexs[i];
}
for(int i=0;i<=g.arcnum;i++){
for (int j = 0; j <= g.arcnum; j++)
{
g.arcs[i][j] = MaxInt;
}
}
for(int k =0; k<g.arcnum;++k){
VerTexType v1,v2;
ArcType w;
cout<<"请输入顶点及权值:";
cin>>v1>>v2>>w;
int i = LocateVex(g,v1);
int j = LocateVex(g,v2);
cout<<i<<" "<<j<<endl;
g.arcs[i][j] = w;
g.arcs[j][i] = g.arcs[i][j];
}
}
// 输出建立好的邻接矩阵
void outs(AMGraph g){
for (int i=0;i<g.vexnum;i++){
for(int j = 0; j<g.vexnum;j++ ){
cout<<" "<<std::right<<setw(6)<<g.arcs[i][j];
}
cout<<endl;
}
}
int main(){
AMGraph g;
CreateUDN(g);
outs(g);
return 0;
}
`