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