图的应用——Prim算法最小生成树

1.实验目的

(1)掌握图的相关概念,包括图、有向图、无向图、子图、连通图、度、入度、出度、简单回路、环等;

(2)掌握图的各种存储结构,包括邻接矩阵和邻接表等;

(3)掌握图的基本运算,包括创建图、输出图、深度优先遍历、广度优先遍历等;

(4)掌握图的其他运算,包括最小生成树、最短路径、拓扑排序和关键路径等算法。

2.实验内容

利用Prim算法求网的最小生成树。

要求和提示:设图的顶点数为10个。为简单起见,网中边的权值设成小于100的整数,可利用C语言的rand()函数产生。

3.源程序和实验结果

#include<bits/stdc++.h>
using namespace std;

#define MAX 100
#define INF 10000

int graph[MAX][MAX];

int prim(int graph[][MAX], int n)
{
    int lowcost[MAX],closedge[MAX];
    int min_1,min_2,sum = 0;
    for(int i = 2;i <= n;i++)
    {
        lowcost[i] = graph[1][i];
        closedge[i] = 1;
    }
    closedge[1] = 0;
    for(int i =1;i <= n-1;i++)
    {
        min_1 = INF;
        min_2 = 0;
        for(int j = 1;j <= n;j++)
        {
            if(lowcost[j] < min_1&&closedge[j]!=0)
            {
                min_1 = lowcost[j];
                min_2 = j;
            }
        }
        cout << "V" << closedge[min_2] << "->V" << min_2 << "=" << min_1 <<endl;
        sum += min_1;
        closedge[min_2] = 0;
        for(int j = 1;j <= n;j++)
        {
            if(graph[min_2][j] < lowcost[j]&& closedge[j] != 0)
            {
                lowcost[j] = graph[min_2][j];
                closedge[j] = min_2;
            }
        }
    }
    return sum;
}

int main()
{
    int m,n,e,v,cost;
    cin >> m >> n;//m顶点数  n边数
    memset(graph,INF,sizeof(graph));
    for(int i = 1;i <= n;i++)
    {
        cin >> v >> e >> cost;
        graph[v][e] = graph[e][v] = cost;
    }
    int Sum;
    Sum = prim(graph, m);
    cout << "最小权值和" << Sum << endl;
    system("pause");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值