Untitled

mail@pastecode.io avatar
unknown
plain_text
6 days ago
2.5 kB
2
Indexable
Never
#include <bits/stdc++.h>
using namespace std;

int find(int x, vector<int>& parent)
{
    if (parent[x] != x)
    {
        parent[x] = find(parent[x], parent);
    }
    return parent[x];
}

void unionByRank(int u, int v, vector<int>& parent, vector<int>& rank)
{
    int rootU = find(u, parent);
    int rootV = find(v, parent);

    if (rootU != rootV)
    {
        if (rank[rootU] < rank[rootV])
        {
            parent[rootU] = rootV;
        }
        else if (rank[rootU] > rank[rootV])
        {
            parent[rootV] = rootU;
        }
        else
        {
            parent[rootV] = rootU;
            rank[rootU]++;
        }
    }
}

int main()
{
    int v, e;
    cin >> v >> e;

    vector<vector<int>> edges(e, vector<int>(3));
    for (int i = 0; i < e; ++i)
    {
        cin >> edges[i][0] >> edges[i][1] >> edges[i][2];
        edges[i][0]--;
        edges[i][1]--;
    }

    int k;
    cin >> k;
    vector<int> mustIncludeIndexes(k);
    for (int i = 0; i < k; ++i)
    {
        cin >> mustIncludeIndexes[i];
    }
    vector<int> parent(v);
    vector<int> rank(v, 0);
    for (int i = 0; i < v; ++i)
    {
        parent[i] = i;
    }
    int tot_weight = 0;
    vector<vector<int>> mst;
    for (int idx : mustIncludeIndexes)
    {
        if (idx < 0 || idx >= e)
        {
            cout << -1 << endl;
            return 0;
        }
        int u = edges[idx][0];
        int v = edges[idx][1];
        if (find(u, parent) == find(v, parent))
        {
            cout << -1 << endl;
            return 0;
        }
        mst.push_back(edges[idx]);
        tot_weight += edges[idx][2];
        unionByRank(u, v, parent, rank);
    }
    sort(edges.begin(), edges.end(), [](const vector<int>& a, const vector<int>& b)
    {
        return a[2] < b[2];
    });
    for (const auto& edge : edges)
    {
        int u = edge[0];
        int v = edge[1];
        int weight = edge[2];

        if (find(u, parent) != find(v, parent))
        {
            mst.push_back(edge);
            tot_weight += weight;
            unionByRank(u, v, parent, rank);
        }
    }
    int componentCount = 0;
    for (int i = 0; i < v; ++i)
    {
        if (find(i, parent) == i)
        {
            componentCount++;
        }
    }

    if (componentCount > 1)
    {
        cout << -1 << endl;
    }
    else
    {
        cout << tot_weight << endl;
    }

    return 0;
}
/*
6 8
1 2 2
1 3 3
2 3 1
3 4 4
4 5 5
2 5 8
5 6 6
4 6 7
3
5 6 7
*/
Leave a Comment