Codechef GALACTIK解决方案

时间:2018-05-13 04:59:48

标签: algorithm data-structures disjoint-sets union-find

Here's the link for the problem:

我使用了union-find算法来解决问题。 代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define INT 100000000
unordered_map<ll, ll> parent;
unordered_map<ll, ll> depth;
std::vector<ll> cost;
ll find_set(ll x) {
    if (x == parent[x])return x;
    parent[x] = find_set(parent[x]);
    return parent[x];
}
void union_set(ll x, ll y) {
    /*
    Creating a disjoint set such that the node with smallest cost 
    being the root using union-rank concept. 
    */
    ll rep1 = find_set(x), rep2 = find_set(y);
    if (depth[rep1] > depth[rep2])parent[rep1] = rep2;
    else if (depth[rep2] >= depth[rep1])parent[rep2] = rep1;
}
int main() {
    ll n, m;
    cin >> n >> m;
    ll c[m + 1][3];
    for (ll i = 1; i <= m; i++) {
        cin >> c[i][1] >> c[i][2]; //Accepting the edges
    }
    for (ll i = 1; i <= n; i++) {
        parent[i] = i;
        cin >> depth[i];
        if (depth[i] < 0)depth[i] = INT;
        /*we assume that each negative cost is replaced by a very 
          large positive cost.*/ 
    }
    for (ll i = 1; i <= m; i++) {
        union_set(c[i][1], c[i][2]);
    }
    set<ll> s;
    std::vector<ll> v;
    //storing representatives of each connected component
    for (auto i = 1; i <= n; i++)s.insert(depth[find_set(i)]);
    for (auto it = s.begin(); it != s.end(); it++)v.push_back(*it);
    sort(v.begin(), v.end());
    if (s.size() == 1) {
        //Graph is connected if there is only 1 connected comp
        cout << 0 << endl;
        return 0;
    }
    bool flag = false;
    ll p = 0;
    for (ll i = 1; i < v.size(); i++) {
        if (v[i] == INT) {
            flag = true;
            break;
        }
        p += (v[0]+v[i]);
    }
    if (flag)cout << -1 << endl;
    else cout << p << endl;
    return 0;
}

我的程序中使用的逻辑: 要找到答案,请取连接组件中所有有效值的最小值。现在连接图表,取上述步骤中所有值的最小值,并从该节点到剩余的所有值如果图已经连接,则答案是0.如果存在一个连接的组件,其中所有节点都无法选择,那么答案是不可能的(-1)。

但是这个解决方案不被接受?它有什么问题?

0 个答案:

没有答案