C语言——最小生成树 图的建立与遍历 最短路径

本文深入探讨了如何使用C++在数据结构中构建和遍历图,并重点讲解了找到图中最小生成树的方法,同时涉及最短路径的计算。对于理解和实践图的算法具有指导意义。
摘要由CSDN通过智能技术生成

 

#include<stdio.h>

#include <queue>//调用队列

#include<iostream>

using namespace std;

#define MVNun 100//最大定点数

#define MaxInt 0x3f3f3f3f//最大值

bool visited[MVNun];

typedef char VerTexType;//字符型顶点

typedef int ArcType;//整形权值

typedef struct WANG//网的邻接矩阵储存

{

    VerTexType vexs[MVNun];//定点信息表

    ArcType arcs[MVNun][MVNun];//邻接矩阵->对称矩阵压缩存储  sa[k]与a[i][j]的关系   k=i(i-1)/2+j-1 i>=j      k=j(j-1)/2+i-1 i<j 

    int vexnum, arcnum;//网的当前点数和边数

}AMGraph;



typedef struct prim//prim算法辅助数组

{

    VerTexType adjvex;//最小边在U中的那个顶点

    ArcType lowcost;//最小边上的权值

}fuzhu;



void zuse()//清屏

{

    cout << endl;

    system("pause");

    system("cls");

}



int LocateVex(AMGraph G1, VerTexType v)//查找

{

    for (int i = 0; i < G1.vexnum; i++)

        if (v == G1.vexs[i])

            return i;

    cout << "未查找该节点!" << endl;

}



int GreateUDN(AMGraph* G)//创建网

{

    int i, j, k;

    ArcType w = 0;

    VerTexType v1, v2;

    printf("输入总点数:");

    cin >> G->vexnum;

    printf("输入总边数:");

    cin >> G->arcnum;

    for (i = 0; i < G->vexnum; i++)//输入顶点信息

    {

        printf("输入第%d节点信息(名称):\n", i + 1);

        cin >> G->vexs[i];

    }

    for (i = 0; i < G->vexnum; i++)//初始化化 压缩矩针

        for ( j = 0; j < G->vexnum; j++)

            G->arcs[i][j] = MaxInt;//初始化为最大值

    for (k = 0; k < G->arcnum; k++)

    {

        printf("输入第%d边信息(例:顶点 a 顶点 b 权值 1 输入格式 ab1)\n", k + 1);

        cin >> v1 >> v2 >> w;

        i = LocateVex(*(G), v1);

        j = LocateVex(*(G), v2);

        G->arcs[j][i] = G->arcs[i][j] = w;

    }

    cout << "初始化完成!" << endl;

    return 1;

}

int GreateUDN2(AMGraph* G)//创建网

{

    int i, j, k;

    ArcType w = 0;

    VerTexType v1, v2;

    printf("输入总点数:");

    cin >> G->vexnum;

    printf("输入总边数:");

    cin >> G->arcnum;

    for (i = 0; i < G->vexnum; i++)//输入顶点信息

    {

        printf("输入第%d节点信息(名称):\n", i + 1);

        cin >> G->vexs[i];

    }

    for (i = 0; i <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值