ccf csp 201812-4 数据中心

这道题目题干非常复杂,但如果仔细理解辨认一下,就会发现,这是一道求最小生成树并找出最长边的问题。

root这个数据甚至没有什么用处。

由此我们可以发现,csp第四题一般都是一道比较套路的算法题。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
int n, m, i, j, u, v, total;
int res = 0;
class Edge{
public:
    int start, to;
    int val;
};
Edge edge[50001];
int pre[10001];
long long ans;

int find(int x){
    if(pre[x] == x){
        return x;
    }else{
        pre[x]=find(pre[x]);
        return pre[x];
    }   
}

bool cmp(Edge a, Edge b){
    return a.val < b.val;
}

inline void kruskal(){
    for(int i = 1; i <= m; i++){
        u=find(edge[i].start);
        v=find(edge[i].to);
        if(u == v) continue;
        ans += edge[i].val;
        res = max(res, edge[i].val);
        pre[u] = v;
        total++;
        if(total == n - 1) break;
    }
}

int main(){
    cin >> n >> m;
    int root;
    cin >> root;
    for(i = 1; i <= n; i++) pre[i] = i;
    for(i = 1; i <= m; i++){
        cin >> edge[i].start >> edge[i].to >> edge[i].val;
    }
    
    sort(edge + 1, edge + m + 1, cmp);
    kruskal();
    
    cout << res << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lalala_HFUT/article/details/86745622