邻接矩阵表示图

图常用两种方式表示,邻接矩阵、邻接表。





graph001.jpg


graph002.jpg


graph003.jpg


graph004.jpg


graph005.jpg


graph006.jpg

0、结构初始化

struct GraphNode {
    int Nv; /* 顶点数 */
    int Ne; /* 边数   */
    WeightType G[maxVertexNum][maxVertexNum];
    ElementType data[maxVertexNum]; /* 存顶点的数据 */
};
struct EdgeNode {
    int v1,v2; /* 有向边 */
    WeightType weight; /* 权重 */
};


1、图的初始化

//初始化一个有vertexNum个顶点,但是没有边的图
struct GraphNode* createGraph(int vertexNum) {
    struct GraphNode* Graph;
    Graph=(struct GraphNode*)malloc(sizeof(struct GraphNode));
    Graph->Nv=vertexNum;
    Graph->Ne=0;

    /* 默认编号从顶点0开始 */
    for (int i=0;i<Graph->Nv;i++) {
        for (int j=0;j<Graph->Nv;j++) {
            Graph->G[i][j]=0;
        }
    }

    return graph;
}


2、向图中插入边

void insertEdge(struct GraphNode* graph,struct EdgeNode* E) {
    Graph->G[E->v1][E->v2]=E->weight;
    /* 如果是无向图,还要插入边<v2,v2> */
    Graph->G[E->v2][E->v1]=E->weight;
}


3、完整建立一个Graph-1

struct GraphNode* buildGraph() {
    struct GraphNode* Graph;
    struct EdgeNode* E;
    int Nv;

    scanf("%d",&Nv);
    Graph=createGraph(Nv);
    scanf("%d",&Ne);
    if (Graph->Ne!=0) {
        E=(struct EdgeNode*)malloc(sizeof(struct EdgeNode));
        for (int i=0;i<Ne;i++) {
            scanf("%d %d %d",E->v1,E->v2,E->weight);
            insertEdge(Graph,E);
        }
    }
    /* 如果顶点有数据的话存入数据 */
    for (int j=0;j<Nv;j++) {
        scanf("%c",&(Graph->data[j]));
    }

    return Graph;
}


4、完整建立一个Graph-2(简化版本)

int G[maxNum][maxNum],Nv,Ne;
void buildGraph() {
    int v1,v2,weight;

    scanf("%d",Nv);
    for (int i=0;i<Graph->Nv;i++) {
        for (int j=0;j<Graph->Nv;j++) {
            Graph->G[i][j]=0;
        }
    }
    scanf("%d",Ne);
    for (int k=0;k<Ne;k++) {
        scanf("%d %d %d",&v1,&v2,&weight);
    }

    G[v1][v2]=weight;
    G[v2][v2]=weight;
}




转载于:https://www.cnblogs.com/WakingUp/p/8543475.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值