Cod sursa(job #796578)

Utilizator lucian666Vasilut Lucian lucian666 Data 11 octombrie 2012 20:49:19
Problema Lazy Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb

//Vasilut
#include<fstream>
#include<cstdio>
#include<algorithm>

#define NN 200001
using namespace std;
ofstream out("lazy.out");

struct drumusor{
    int x,y,nr;
    long long c1,c2;
    };
    drumusor v[NN];

int T[NN],n,m,H[NN],k;

bool cmp(drumusor i,drumusor j)
{
    return i.c1 < j.c1 || ( i.c1 == j.c1  && i.c2 > j.c2 ) ;
}

int cauta(int );
void unire(int ,int );
void read();
void kruskal();

const int maxb=200001;
char buf[maxb];
int ptr=0;


inline int getint() {
    int nr=0;
    while(buf[ptr]<'0'||'9'<buf[ptr])
        if (++ptr>=maxb) fread(buf,maxb,1,stdin),ptr=0;
    while ('0'<=buf[ptr]&&buf[ptr]<='9') {
        nr=nr*10  +buf[ptr]-'0';
        if (++ptr>=maxb) fread(buf,maxb,1,stdin),ptr=0;
    }
    return nr;
}

inline long long getlong()
{
    long long  nr=0;
    while(buf[ptr]<'0'||'9'<buf[ptr])
        if (++ptr>=maxb) fread(buf,maxb,1,stdin),ptr=0;
    while ('0'<=buf[ptr]&&buf[ptr]<='9') {
        nr=nr*10*1LL  +buf[ptr]-'0';
        if (++ptr>=maxb) fread(buf,maxb,1,stdin),ptr=0;
    }
    return nr;
}
int main()
{
    read();
    kruskal();
    return 0;
}

void read()
{
    freopen("lazy.in","r",stdin);
    n=getint();
    m=getint();
    for(int x,y,i=1;i<=m;i++)
    {

    if(i<=n)
    T[i]=i;
        long long c1,c2;
        x=getint();
        y=getint();
        c1=getlong();
        c2=getlong();
        v[i].x=x;
        v[i].y=y;
        v[i].c1=c1;
        v[i].c2=c2;
        v[i].nr=i;
    }
}


int cauta(int nod)
{
    if( nod !=T[nod] )
    T[nod]=cauta(T[nod]);
        return T[nod];
}

void unire(int nod1,int nod2)
{
    T[cauta(nod1)]=cauta(nod2);
}

void kruskal()
{


    sort(v+1,v+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        if( cauta(v[i].x ) != cauta(v[i].y) )
        {
            ++k;
            out<<v[i].nr<<" "<<'\n';
            unire(v[i].x,v[i].y);
        }
        if ( k == n-1 )
            return ;
    }
}