Cod sursa(job #2351310)

Utilizator bodea.georgianaBodea Georgiana bodea.georgiana Data 22 februarie 2019 10:33:01
Problema Politie Scor 0
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.56 kb
#include <cstdio>
#include <queue>
#define N 250002
#include <set>

using namespace std;
FILE *f,*g;

struct bla
{
    int x,y,c,p;
};

struct compar
{
    bool operator () (bla A, bla B)
    {
        if(A.c!=B.c)
            return (A.c>B.c);
        return (A.p>B.p);
    }
};
priority_queue < bla, vector <bla>, compar > q;
int tata[N],rang[N];

struct cmp
{
    bool operator() (int A, int B)
    {
        return (A>B);
    }
};
set <int,cmp> sol;
set <int> :: iterator it;

int root(int nod)
{
    while(nod!=tata[nod])
        nod=tata[nod];
    return nod;
}

void unite(int ma, int mb)
{
    if(rang[ma]<rang[mb])
        tata[ma]=mb;
    else
        tata[mb]=ma;
    if(rang[ma]==rang[mb])
        ++rang[ma];
}

int main()
{
    f=fopen("politie.in","r");
    g=fopen("politie.out","w");
    int cat,k,n,m,a,b,ma,mb;
    fscanf(f,"%d %d %d %d",&n,&m,&cat,&k);
    bla val;
    for(int i=1;i<=m;++i)
    {
        fscanf(f,"%d %d %d %d",&val.x,&val.y,&val.c,&val.p);
         q.push(val);
    }
    for(int i=1;i<=n;++i)
        tata[i]=i;
    int nr=1;
    for(int i=1;i<=m;++i)
    {
        val=q.top();
        q.pop();
        a=val.x;
        b=val.y;
        ma=root(a);
        mb=root(b);
        if(ma!=mb)
        {
            unite(ma,mb);
            sol.insert(val.p);
        }
    }
    for(it=sol.begin();it!=sol.end();++it)
        if(nr<=k)
            fprintf(g,"%d\n",(*it));
        else
        {
            break;
        }
    fclose(f);
    fclose(g);
    return 0;
}