11631 - Dark roads solution


It's a simple MST problem.

#include<bits/stdc++.h>
using namespace std;
#define MX 100005
#define pii pair<int,int>
#define pip pair<int,pii>
vector <pip> adj;
int node,edge;
int par[MX],sz[MX];
struct union_find
{
    int n;
    union_find(int n)
    {
        for (int i=0;i<=n;i++) sz[i]=1,par[i]=i;
    }
    int root(int a)
    {
        while(par[a]!=a)
        {
            par[a] = par[par[a]];
            a = par[a];
        }
        return a;
    }
    bool isSame(int a,int b)
    {
        return root(a)==root(b);
    }
    void make_union(int a,int b)
    {
        int i = root(a);
        int j = root(b);
        if (sz[i]<sz[j])
        {
            par[i]=j;
            sz[j]+=sz[i];
        }
        else
        {
            par[j]=i;
            sz[i]+=sz[j];
        }
    }
};
long long int  Kruskal()
{
    union_find UF(node);
    long long int total=0;
    for (int i=0;i<edge;i++)
    {
        int u = adj[i].second.first;
        int v = adj[i].second.second;
        int cost = adj[i].first;
        if (! UF.isSame(u,v))
        {
            UF.make_union(u,v);
            total+=cost;
        }
    }
    return total;
}
int main()
{

    while(1){
    scanf("%d%d",&node,&edge);
    if (node == 0 && edge == 0) break;
    adj.resize(edge);
    int i;
    long long int total=0;
    for(i=0;i<edge;i++)
    {
        int u,v,cost;
        scanf("%d%d%d",&u,&v,&cost);
        adj[i]=pip(cost,pii(u,v));
        total += cost;
    }
    sort(adj.begin(),adj.end());
    long long int total2 = Kruskal();
    cout<<total-total2<<endl;
    adj.clear();
    }
    return 0;
}

No comments

Theme images by enot-poloskun. Powered by Blogger.