Prim算法求最小生成树 2022.3.12

186 阅读1分钟

考研算法

题目

题目链接

题目要求

给定各条边,求出最小生成树

代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=510,M=100010,INF=0x3f3f3f3f;
bool st[N];
int g[N][N],dist[N];
int n,m;


int prim()
{
    memset(dist,0x3f,sizeof dist);
    int res=0;
    dist[1]=0;
    for (int i=0;i<n;i++)
    {
        int t=-1;
        for (int j=1;j<=n;j++)
        {
            if (!st[j] && (t==-1 || dist[t]>dist[j]))
            {
                t=j;
            }
        }
        if (dist[t]==INF) return INF;
        st[t]=true;
        res+=dist[t];
        for (int j=1;j<=n;j++)
        {
            dist[j]=min(dist[j],g[t][j]);
        }
        
    }
    return res;
}
int main()
{
    scanf("%d%d",&n,&m);
    memset(g,0x3f,sizeof g);
    while (m--)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        g[a][b]=g[b][a]=min(g[a][b],c);
    }
    int res=prim();
    if (res==INF) cout<<"impossible";
    else
    {
        cout<<res<<endl;
    }
}

知识点

有点累,过几天补一下坑