C++邻接矩阵构造无向图和无向网
假设我们要创建一个无向图的邻接矩阵
#include<iostream>
#define OK 1
#define ERROR 0
#define MaxNum 100 //最大顶点数
typedef char VexType; //顶点数据类型为char型
typedef int VarType; //边的数据类型为int型
typedef int Status;
using namespace std;
struct DIAgram{
VexType vexs[MaxNum]; //顶点数组
VarType vars[MaxNum][MaxNum]; //邻接矩阵
int vexnum,arcnum; //图的总顶点数和总边数
};
int place(DIAgram G,char v)
{
for(int i=0;i<G.vexnum;i++)
{
if(G.vexs[i]==v) //返回顶点下标
return i;
}
return ERROR;
}
Status CreateUDG(DIAgram &G)
{
int i,a,b;char v1,v2;
cin>>G.vexnum>>G.arcnum; //输入图的总顶点数和总边数
for(i=0;i<G.vexnum;i++)
{
cin>>G.vexs[i]; //输入每个顶点的信息
for(int j=0;j<G.vexnum;j++)
G.vars[i][j]=0; //矩阵的每个元素即边初始化为0
}
for(i=0;i<G.arcnum;i++)
{
cin>>v1>>v2; //输入一条边两头的的两个顶点
a=place(G,v1);b=place(G,v2); //根据输入的顶点信息找到对应的下标
G.vars[a][b]=1; //每个连接上的边设为1
G.vars[b][a]=G.vars[a][b]; //对称边也设为1
}
return OK;
}
void print(DIAgram G)
{
for(int i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
cout<<G.vars[i][j]<<" ";
cout<<endl;
}
}
int main()
{
DIAgram G;
CreateUDG(G);
print(G);
return 0;
}
这个无向图有5个顶点,6条边,因此我们需要创建一个5*5的邻接矩阵,然后输入每个顶点的信息,等会就按照你输入的信息查找相应顶点的下标。
结果如图所示:
创造无向网和创造无向图非常相似,只是初始化的时候不是0而是无穷大,多了权值的输入输出:
#include<iostream>
#define OK 1
#define ERROR 0
#define MaxInt 32767 //极大值为32767(无穷 )
#define MaxNum 100 //最大顶点数
typedef char VexType; //顶点数据类型为char型
typedef int VarType; //边的权值数据类型为int型
typedef int Status;
using namespace std;
struct DIAgram{
VexType vexs[MaxNum]; //顶点数组
VarType vars[MaxNum][MaxNum]; //邻接矩阵
int vexnum,arcnum; //网的总顶点数和总边数
};
int place(DIAgram G,char v)
{
for(int i=0;i<G.vexnum;i++)
{
if(G.vexs[i]==v)
return i;
}
return ERROR;
}
Status CreateUDN(DIAgram &G)
{
int i,a,b,w;char v1,v2;
cin>>G.vexnum>>G.arcnum; //输入网的总顶点数和总边数
for(i=0;i<G.vexnum;i++)
{
cin>>G.vexs[i]; //输入每个顶点的信息
for(int j=0;j<G.vexnum;j++)
G.vars[i][j]=MaxInt; //矩阵的每个元素即每个权值初始化为无穷大
}
for(i=0;i<G.arcnum;i++)//构造邻接矩阵
{
cin>>v1>>v2>>w;//输入一条边两头的的两个顶点和权值
a=place(G,v1);b=place(G,v2);
G.vars[a][b]=w;
G.vars[b][a]=G.vars[a][b];
}
return OK;
}
void print(DIAgram G)
{
for(int i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
cout<<G.vars[i][j]<<" ";
cout<<endl;
}
}
int main()
{
DIAgram G;
CreateUDN(G);
print(G);
return 0;
}