Cod sursa(job #1709598)

Utilizator forsakenAweUNIBUC Suditu Cornoiu Chihai forsakenAwe Data 28 mai 2016 13:01:08
Problema Politie Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.13 kb
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
int n, m, d, P;
pair<pair<int,int>,pair<int,int> > e[500100];
int t[250100];

int Find(int x) {
    return x == t[x] ? x : t[x] = Find(t[x]);
}
int nr=0;
vector<int> S;

int main()
{
    freopen("politie.in","r",stdin);
    freopen("politie.out","w",stdout);

    cin>>n>>m>>d>>P;
    for(int i=1;i<=n;i++) t[i]=i;
    nr = n;
    for (int i=1;i<=m;i++) {
        scanf("%d%d%d%d", &e[i].se.fi, &e[i].se.se, &e[i].fi.fi, &e[i].fi.se);
    }
    sort(e+1,e+m+1);
  for(int i = 1; i <= m && nr > 1;i++) {
        int a = e[i].se.fi, b = e[i].se.se;
        int tip = e[i].fi.fi;
        int per = e[i].fi.se;
        int pa = Find(a), pb = Find(b);
        if (pa == pb) continue;

        t[pa]=pb;
        nr--;
        S.push_back(per);
    }


    set < int > st;
    for(auto x : S) st.insert(x);
    S.clear();
    for(auto x : st) S.push_back(x);
    int k = min(P, (int)S.size());
    reverse(S.begin(), S.end());
    for(int i = 0; i < k; i++ ) {
        printf("%d\n", S[i]);
    }







    return 0;
}