最小生成树(prime)

题目:给一个无向图,给定每条边信息,求该图的最小生成树。

思路:prime算法就是一个贪心的思想,先找定一个点,然后每次加入一条最短的边,直到所有点被用,此时的和就是最小生成树的权值。邻接矩阵存边信息的prime时间复杂度为O(n^2)

代码:

#include

using namespace std;
const int maxn=105,inf=1<<30;
int Map[maxn][maxn],vis[maxn],d[maxn];
int n,q,ans;
int prim()
{
    fill(vis,vis+maxn,0);   //初始化每个点都未被加入到答案集合中
    fill(d,d+maxn,inf);     //初始化每个顶点到答案集合的最近距离
    d[1]=0;                 //将顶点1加入到答案集合中
    ans=0;                  //最小生成树权值
    while(true)
    {
        int v=-1;           //记录下一个将要加入答案集合的顶点
        for(int i=1; i<=n; i++) //贪心选取离答案集合距离最近的顶点
            if(!vis[i]&&(v==-1||d[i]>n>>m)
    {
        fill(&Map[0][0],&Map[maxn][0],inf);
        for(int i=1; i<=m; i++)
        {
            int u,v,w;
            cin>>u>>v>>w;
            Map[u][v]=w;
            Map[v][u]=w;
        }
        cout<

测试数据:

5 6
1 2 3
1 3 2
2 3 1
3 5 4
2 4 5
4 5 7

输出:12

你可能感兴趣的:(算法设计与分析,——,贪心)