图的表示邻接矩阵

邻接矩阵(adjacency matrix)是图的最基本的实现方式,使用方阵A[n][n]表示有n个顶点构成的图,其中每个单元,各自负责描述一对顶点之间可能存在的邻接关系。

对于无权图,存在(不存在)从顶点u到v的边,当且仅当A[u][v]=1(0)。下图没无向图和有向图的邻接矩阵的实例。

这一方式如果推广至带权的网络,各邻接矩阵可以从布尔型改为整型或者浮点型,记录所对应边的权重。对于不存在的边,通常统一取值为0或者无穷。

时间性能,静态和动态操作仅需要O(1)。代价为空间的冗余。及时向量在扩容的代价很大,就分摊意义而言,单次操作的耗时亦不过O(n)

空间性能,空间总量渐进地不超过O(n^{2})。对于无向图而言有改进的余地,无向图的邻接矩阵必为对称阵,除自环以外的每条边,都重复地存放了两次。所以,近一半的单元都是冗余的。可以使用压缩存储等技巧,进一步提高空间效率。

实现(有权无向图)

#include<iostream>
using namespace std;
typedef struct
{
    char vertex[105]; // 顶点
    int am[105][105]; // 领接矩阵
    int vertexn; // 点数
    int edgen; // 边数
}creat;
void creatn(creat &m)
{
    cout<<"输入顶点数和边数:"<<endl;;
    cin>>m.vertexn;
    cin>>m.edgen;
    cout<<"输入顶点:"<<endl;
    for(int i=0;i<m.vertexn;i++){
        cin>>m.vertex[i];
    }
    for(int i=0;i<m.vertexn;i++)
    for(int j=0;j<m.vertexn;j++){
        m.am[i][j]=-1; // 表示空
    }  // 创建领接矩阵
    for(int i=0;i<m.edgen;i++){
        cout<<"输入两个点的坐标,并且输入它们的权:"<<endl;
        int a,b,c;
        cin>>a>>b>>c;
        m.am[a][b]=c;
        m.am[b][a]=m.am[a][b];
    }
}
void print(creat m)
{
    for(int i=0;i<m.vertexn;i++){
    for(int j=0;j<m.vertexn;j++)
        cout<<m.am[i][j]<<" ";
        cout<<endl;
    }
}
int main()
{
    creat g;
    creatn(g);
     print(g);
}

 

猜你喜欢

转载自blog.csdn.net/qq_37291934/article/details/89342965