Cod sursa(job #613505)

Utilizator CS-meStanca Marian Ciprian CS-me Data 28 septembrie 2011 17:23:40
Problema Sortare topologica Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
#define INF  2147483647
FILE *fin=fopen("sortaret.in","r");
FILE *fout=fopen("sortaret.out","w");

int n,m,i,a,b,H[50005],j,poz[50001],x;

// functii pentru noduri si copii.
inline int father(int nod) { // pozitia tatalui copilului de pe pozitia "nod"
    return nod / 2;
}

inline int left_son(int nod) { // pozitia copilului tatalui de pe pozitia "nod"
    return nod * 2;
}

inline int right_son(int nod) { // pozitia copilului tatalui de pe pozitia "nod"
    return nod * 2 + 1;
}



void sift(int H[], int n, int k) {
    int son,aux;
    son=1;
    while(son){ // cat timp copilul este mai mare decat tatal
        son = 0;
        if (left_son(k)<=n) { // verific daca pozitia fiului din stanga este in heap (elementul apartine heap-ului)
            son=left_son(k);
            if ( right_son(k)<=n && H[right_son(k)]>H[left_son(k)] ) { // daca fiul din dreapta este in heap
                son=right_son(k); // iar valoarea lui este mai mare decat a celuilalt copil ...
            }
            if(H[son]<=H[k]){
                son=0; // valoarea tatalui este mai mare decat a copiilor
            }
        }

        if(son!=0){ // daca exista un copil cu valoarea mai mare decat a tatalui
            aux=H[k]; // interschimba
            H[k]=H[son];
            H[son]=aux;

            k = son; // pozitia tatalui devine pozitia fiului anterior (se alege alt tata)
        }
    }
}

void build_heap(int H[], int n){
int i;
    for(i=n/2; i>0; i--) {
        sift(H, n, i);
    }
}




void heap_sort(int H[], int n){
int aux,i;
    build_heap(H,n);

    for (i = n; i >= 2; --i) {
        aux=H[1];
        H[1]=H[i];
        H[i]=aux;

        sift(H, i - 1, 1);
    }
}


int main(){

    fscanf(fin,"%d %d",&n,&m);

    for(i=1;i<=50001;i++){
        H[i]=-INF;
    }

    fscanf(fin,"%d %d",&a,&b);
    H[1]=a;
    H[2]=b;
    poz[a]=1;
    poz[b]=2;

    for(i=2;i<=m;i++){
        fscanf(fin,"%d %d",&a,&b);
        x=poz[a]*2;
        if(H[x]==-INF){
            H[x]=b;
            poz[b]=x;
        }
        else{
            H[x+1]=b;
            poz[b]=x+1;
        }
    }

    heap_sort(H, n);

    for(i=1;i<=50001;i++){
        if(H[i]!=-INF) fprintf(fout,"%d ",H[i]);
    }



return 0;
}