关于最大生成树的问题

本来适合最小生成树几乎一模一样的,但写的时候碰到了点小插曲,导致调试了好久才发现错误。写篇文章以后让自己注意下类似问题。


因为和最小生成树很相像,就不再写注释了。

附上链接 : https://vjudge.net/contest/210090#problem/G

#include <algorithm>
#include <cstring>
#include <iostream>
#define MAX 2001
#define INF 0x3f3f3f
using namespace std;
int g[MAX][MAX], d[MAX], n, m;
int vst[MAX];

void prim(){
    ios::sync_with_stdio(0);
    fill(vst, vst+MAX, 0);
    fill(d, d+MAX, -INF);
    int ans=0;
    d[1]=0;
    
    for(int i=1; i<=n; i++){
        
        int u=-1,MIN=-INF;
        
        for(int j=1 ;j<=n; j++){
            if(vst[j]==0 && d[j]>MIN){//一定是d[j]>MIN,而不是>= 。 不过如果数据设置不一样,要根据实际情况调整。
                u=j;
                MIN=d[j];
            }
        }

        if(u == -1){cout<<"-1"<<endl; return ;}
        
        ans+=d[u];
        vst[u] = 1;
        
        for(int v=1; v<=n; v++){
            if(vst[v]==0 && g[u][v]>d[v]){
                d[v] = g[u][v];
            }
        }
        
    }
    
    cout<<ans<<endl;
}

int main()
{
    ios::sync_with_stdio(0);
    
    int k1, k2, s;
    
    while(cin >> n >> m){
        
        fill(g[0], g[0]+MAX*MAX, -INF);
        
        for(int i=0; i<m; i++){
            cin >> k1 >> k2 >> s;
            g[k1][k2]=s>g[k1][k2]?s:g[k1][k2];
            g[k2][k1]=s>g[k2][k1]?s:g[k2][k1];
        }
 
        for(int i=1;i<=n;i++){
            g[i][i]=0;
        }
        
        prim();
        
    }
    
    return 0;
    
}


猜你喜欢

转载自blog.csdn.net/StarrYooSkY/article/details/79224998