邻接矩阵

#include<bits/stdc++.h>
#define MaxVertexNum 100 //最大顶点
#define INFINITY 65535 // ∞设为双字节无符号整数的最大值65535
using namespace std;

typedef int Vertex; //用顶点下标表示顶点,为整型
typedef int WeightType; //边的权值
typedef char DataType; //顶点储存的数据类型
typedef struct ENode *PtrToENode;
struct ENode{
    Vertex V1,V2; //有向边<V1,V2>
    WeightType Weight; //权重
};
typedef PrtToENode Edge; //图结点的定义
typedef GNode *PtrToGNode;
struct GNode{
    int Nv; //顶点数
    int Ne; //边数
    WeightType G[MaxVertexNum][MaxVertexNum]; //邻接矩阵
    DataType Data[MaxVertexNum]; //存顶点的数据
    //注意:很多情况下,顶点无数据,此时Data[]可以不用出现
};
typedef PtrToGNode MGraph; //以邻接矩阵存储的图类型
MGraph CreatGraph(int VertexNum){
    /* 初始化一个有VertexNum个顶点但没有边的图 */
    Vertex V,W;
    MGraph Graph;
    Graph = (MGraph)malloc(sizeof(struct GNode));
    Graph->Nv = VertexNum;
    Graph->Ne = 0;//初始化邻接矩阵,这里默认顶点编号从0开始,到(Graph->Nv-1)
    for(V = 0; V<Graph->Nv; V++){
        for(W = 0; W<Graph->Nv; W++){
            Graph->G[V][W] = INFINITY;
        }
    }
    return Graph;
}

void InsertEdge(MGraph Graph,Edge E){
    //插入边<V1,V2>
    Graph->G[E->V1][E->V2] = E->Weight; 
    //若是无向图,还要插入边<V1,V2>
    //Graph->G[E->V2][E->V1] = E->Weight;
}

MGraph BuildGraph(){
    MGraph Graph;
    Edge E;
    Vertex V;
    int Nv,i;
    scanf("%d",&Nv);//读入顶点个数
    Graph = CreatGraph(Nv);//初始化有nv个顶点但没有边的图
    scanf("%d",&(Graph->Ne));//边数
    if(Graph->Ne != 0){
        E = (Edge)malloc(sizeof(struct ENode));
        //建立边结点,读入边,格式化为“起点 终点 权重”,插入邻接矩阵
        for(i = 0; i<Graph->Ne; i++){
            scanf("%d %d %d",&E->V1,&E->V2,&E->Weight);
            //注意如果权重不是整型,%d要改
            InsertEdge(Graph , E);
        }
    }
    for(V = 0; V<Graph->Nv; V++){
        scanf("%c",&(Graph->Data[V]));
    }
    return Graph;
}

邻接矩阵

posted @ 2019-12-28 16:15  acwarming  阅读(433)  评论(0编辑  收藏  举报