Prim

模板题

https://www.luogu.org/problem/show?pid=3366

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define maxn 233333333333
using namespace std;
int n,m,s,t;
int a[5005][5005];
int dis[100005],f[100005];

int main()
{
    cin>>n>>m;
    int u,v,w;
    memset(a,127/3,sizeof(a));
    memset(dis,127/3,sizeof(dis));
    for(int i=1;i<=m;++i)
    {
        scanf("%d%d%d",&u,&v,&w);
        if(w<a[u][v])    a[u][v]=w,a[v][u]=w;
        //因为有重边,所以读入时选择最小的边
    }
    for(int i=1;i<=n;i++)f[i]=1;
    dis[1]=0;
    for(int i=1;i<=n;++i)
    {
        int k=0,o=0;
        for(int j=1;j<=n;j++)if(f[j]==1&&(dis[j]<dis[k]))k=j;
        f[k]=0;
        for(int j=1;j<=n;++j)
        {
            if(f[j]==1&&(a[k][j]<dis[j]))
            dis[j]=a[k][j],o=j;
        }
    }
    int ans=0;
    for(int i=1;i<=n;++i)ans+=dis[i];
    //累加答案
    if(ans<maxn)cout<<ans;
    else puts("orz");
    puts("");
    return 0;
}
View Code

原文地址:https://www.cnblogs.com/gc812/p/5913825.html