Cod sursa(job #1714419)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 8 iunie 2016 09:50:04
Problema Politie Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.22 kb
#include <stdio.h>
#include <algorithm>
#define nod 250005
#define muchie 500005
using namespace std;
struct elem{int x,y,tip,grad;};
elem v[muchie];
int t[nod],rasp[nod];
bool cmp(elem a,elem b){
    if(a.tip==b.tip)
        return a.grad<b.grad;
    return a.tip<b.tip;
}
int my_find(int val){
    if(t[val]==val)
        return val;
    else
        return t[val]=my_find(t[val]);
}
void my_union(int val1,int val2){
    int boss1=my_find(val1);
    int boss2=my_find(val2);
    t[boss1]=boss2;
}
int main(){
    FILE *fin,*fout;
    fin=fopen("politie.in","r");
    fout=fopen("politie.out","w");
    int i,j,n,m,k,p,q;
    fscanf(fin,"%d%d%d%d",&n,&m,&q,&p);
    for(i=1;i<=m;i++)
        fscanf(fin,"%d%d%d%d",&v[i].x,&v[i].y,&v[i].tip,&v[i].grad);
    sort(v+1,v+m+1,cmp);
    for(i=1;i<=n;i++)
        t[i]=i;
    for(i=1,k=0;i<=m;i++)
        if(my_find(v[i].x)!=my_find(v[i].y)){
            k++;
            rasp[k]=v[i].grad;
            my_union(v[i].x,v[i].y);
        }
    sort(rasp+1,rasp+k+1);
    for(i=k,j=0;i>=1&&j<=p;i--)
        if(rasp[i]!=rasp[i+1]){
            fprintf(fout,"%d\n",rasp[i]);
            j++;
        }
    fclose(fin);
    fclose(fout);
    return 0;
}