Cod sursa(job #1277239)

Utilizator nicolaegutaNicolae Guta nicolaeguta Data 27 noiembrie 2014 13:45:01
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <algorithm>
#define Nmax 30005

using namespace std;

struct el
{
    int x,y,cost;
    bool operator <(const el &A) const
    {
        return cost<A.cost;
    }
};
el v[Nmax];
int t[Nmax];
bool viz[Nmax];

struct Edge
{
    int nod,cost;
};
vector <Edge> L[Nmax];

inline void Unite(int a, int b)
{
    t[a]+=t[b]; t[b]=a;
}

inline int Find(int a)
{
    int rad,i=a;
    while(a>0)
        a=t[a];
    rad=a;
    while(i>0)
    {
        a=t[i];
        t[i]=rad;
        i=a;
    }
    return rad;
}

int main()
{
    int x,y,i,k;
    Edge w;
    freopen ("radiatie.in","r",stdin);
    freopen ("radiatie.out","w",stdout);
    scanf("%d%d%d", &n,&m,&k);
    for(i=1;i<=m;++i)
        scanf("%d%d%d", &v[i].x,&v[i].y,&v[i].cost);
    sort(v+1,v+m+1);
    for(i=1;i<=n;++i) t[i]=-1;
    for(i=1;i<=n;++i)
    {
        x=Find(v[i].x); y=Find(v[i].y);
        if(x!=y)
        {
            Unite(x,y);
            viz[i]=true;
        }
    }
    for(i=1;i<=n;++i) L[i].clear();
    for(i=1;i<=n;++i)
        if(viz[i])
        {
            w.nod=v[i].y; w.cost=v[i].cost;
            L[v[i].x].push_back(w);
        }

    return 0;
}