Pagini recente » Cod sursa (job #223633) | Cod sursa (job #2352073) | Romanii medaliati la IOI | Cod sursa (job #640043) | Cod sursa (job #2583973)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("rusoaica.in");
ofstream fout("rusoaica.out");
const int NMAX = 100000;
struct muchie
{
int nod1, nod2, cost;
bool operator < (const muchie &a)const{
return cost<a.cost;
}
};
vector <muchie> muchii;
int h[NMAX+5], t[NMAX+5]; ///h - vectorul de inaltimi, iar t- vectorul de tati
int FindSet(int x)
{
int cx=x, aux;
while(t[x]!=x)
x=t[x];
///Incerc sa optimizez radacina pentru urmatoarele operatii
///Cu alte cuvine aici fac compresia drumurilor
while(cx!=x)
{
aux=t[cx];
t[cx]=x;
cx=aux;
}
return x;
}
void UnionSet(int x, int y)
{
/// x si y sunt radacinile celor 2 arbori
if(h[x]==h[y])
{
t[x]=y;
h[y]++;
}
else
{
if(h[x]>h[y])
t[y]=x;
else
t[x]=y;
}
}
int main()
{
int n, m, a, i, u, v, c, tx, ty;
muchie aux;
fin>>n>>m>>a;
for(i=1;i<=n;i++)
{
h[i] = 1;
t[i] = i;
}
for(i=1;i<=m;i++)
{
fin>>u>>v>>c;
aux.nod1 = u;
aux.nod2 = v;
aux.cost = c;
muchii.push_back(aux);
}
sort(muchii.begin(), muchii.end());
long long sol = 0;
int solm =0;
for(i=0;i<muchii.size();i++)
{
aux = muchii[i];
tx = FindSet(muchii[i].nod1);
ty = FindSet(muchii[i].nod2);
if(tx!=ty)
{
if(aux.cost <= a)
{
sol = sol + aux.cost;
UnionSet(tx, ty);
solm++;
}
else
{
sol = sol + a - aux.cost;
UnionSet(tx, ty);
solm++;
}
}
else
sol = sol - aux.cost;
}
if(solm!=(n-1))
{
sol = sol + ((n-1) - solm)*a;
}
fout<<sol<<"\n";
return 0;
}