邻接矩阵
邻接矩阵用两个数组表示图的,一个是一维数组,存储图中顶点的信息,另一个是二维数组即矩阵,存储顶点之间相邻的信息,也就是边的信息。
设图G=(V,E)有n的顶点,则其对应的邻接矩阵A是个n*n的二维数组:
A[i,j]=1 表示i和j之间连通
A[i,j]=0 表示i和j之间不连通
注:无向图对应的邻接矩阵一定是个对称矩阵,有向图的矩阵则不一定对称
算法实现
typedef struct
{
char V[MAXSIZE];
int arcs[MAXSIZE][MAXSIZE];
int e;
int n;
}Graph;
int LocateVex(Graph *G,char v)
{
for(int i=0;i<G->n;i++)
{
if(G->V[i]==v)
{
return i;
}
}
return -1;
}
int CreateAdj(Graph *G)
{
int i,j,k;
char v1,v2;
cout<<"请输入图的顶点数和边数"<<endl;
cout<<"顶点数n=";
cin>>G->n;
cout<<"边数e=";
cin>>G->e;
cout<<"请输入图的顶点信息"<<endl;
getchar();
for(i=0;i<G->n;i++)
{
cin>>G->V[i];
}
for(i=0;i<G->n;i++)
{
cout<<"顶点信息 "<<G->V[i];
}
cout<<endl;
for(i=0;i<G->n;i++)
{
for(j=0;j<G->n;j++)
{
G->arcs[i][j]=0;
}
}
cout<<"请输入图的边的信息"<<endl;
for(k=0;k<G->e;k++)
{
cout<<"请输入第"<<k+1<<"条边的两个端点"<<endl;
getchar();
cin>>v1;
cout<<" ***** v1 "<<v1<<endl;
cin>>v2;
cout<<" ***** v2 "<<v2<<endl;
i=LocateVex(G,v1);
cout<<"v1 "<<i<<endl;
j=LocateVex(G,v2);
cout<<"v2 "<<j<<endl;
if(i>=0&&j>=0)
{
G->arcs[i][j]=1;
G->arcs[j][i]=1;
}
}
}
注:若要构造有向图的邻接矩阵,则把最后一个for()循环内的对应代码更改为
if(i>=0&&j>=0)
{
//构造有向图的邻接矩阵
G->arcs[i][j]=1;
}
运行结果
