无向图的连接矩阵特点如下:
1、无向图的邻接矩阵是对称矩阵,并且是唯一的
2、第i行或第i列非0元素的个数正好是第i个节点的度;
有向图邻接矩阵特点:
1、有向图的邻接矩阵不一定是对称的
2、第i行非零元素的个数正好是第i个节点的出度,第i列非零元素的个数正好是第i个节点的入度。
#include<iostream>
using namespace std;
#define MaxVnum 100 //节点数的最大值
typedef char VexType;//节点的数据类型,根据需要定义
typedef int EdgeType;//边上权值的数据类型,若为不带权值的图,则为0或1
//定义节点结构体
typedef struct{
VexType Vex[MaxVnum];//一维数组存储节点信息
EdgeType Edge[MaxVnum][MaxVnum];
int vexnum,edgenum;
}AMGraph;
void print(AMGraph G){
cout<<"图的邻接矩阵为:"<<endl;
for(int i=0;i<=G.vexnum;i++){
for(int j=0;j<=G.vexnum;j++){
cout<<G.Edge[i][j]<<'\t';
}
cout<<endl;
}
}
int locatevex(AMGraph G,VexType x){
for(int i=0;i<G.vexnum;i++){
if(x==G.Vex[i]){
return i;
}
}
return -1;
}
void CreateAMGraph(AMGraph &G){
int i,j;
VexType u,v;
cout<<"请输入顶点数:"<<endl;
cin>>G.vexnum;
cout<<"输入边数:"<<endl;
cin>>G.edgenum;
cout<<"请输入顶点信息"<<endl;
for(i=0;i<G.vexnum;i++){
cin>>G.Vex[i];
}
for(i=0;i<G.vexnum;i++){
for(j=0;j<G.vexnum;j++){
G.Edge[i][j]=0;//∞ 0X3f3f3f3f
}
}
cout<<"输入每条边依附的两个顶点:"<<endl;
while(G.edgenum--){
cin>>u>>v;
i=locatevex(G,u);
j=locatevex(G,u);
if(i != -1 && j!=-1){
G.Edge[i][j]=G.Edge[j][i]=1;
}else{
cout<<"输入顶点信息错误,请重新输入"<<endl;
G.edgenum++;
}
}
}
int main(){
AMGraph G;
CreateAMGraph(G);
print(G);
return 0;
}