#include #include #include using namespace std; #define SOUBOR_VSTUP "skladiste.in" #define MAXINT 100000 #define MAX_N 500 typedef struct ulicka { int kam; int delka; bool vodic; } ulicka; typedef struct krizovatka { bool final_lichy; int odkud_licha; int vzdalenost_licha; bool final_sudy; int odkud_suda; int vzdalenost_suda; vector ulicky; } krizovatka; int halda_licha[2*MAX_N]; int halda_suda[2*MAX_N]; int halda_licha_velikost=0; int halda_suda_velikost=0; krizovatka vrchol[MAX_N]; void halda_licha_vloz(int prvek) { int i=halda_licha_velikost; halda_licha_velikost++; halda_licha[i]=prvek; while(i>0 && (vrchol[halda_licha[(i-1)/2]].vzdalenost_licha>vrchol[halda_licha[i]].vzdalenost_licha)) { int pomocna=halda_licha[(i-1)/2]; halda_licha[(i-1)/2]=halda_licha[i]; halda_licha[i]=pomocna; i=(i-1)/2; } } void halda_suda_vloz(int prvek) { int i=halda_suda_velikost; halda_suda_velikost++; halda_suda[i]=prvek; while(i>0 && (vrchol[halda_suda[(i-1)/2]].vzdalenost_suda>vrchol[halda_suda[i]].vzdalenost_suda)) { int pomocna=halda_suda[(i-1)/2]; halda_suda[(i-1)/2]=halda_suda[i]; halda_suda[i]=pomocna; i=(i-1)/2; } } int halda_licha_odeber() { int vrat=halda_licha[0]; halda_licha_velikost--; halda_licha[0]=halda_licha[halda_licha_velikost]; int i=0; while(2*i+10) { printf("Odebiram vrchol z liche\n"); int i=halda_licha_odeber(); if(!vrchol[i].final_lichy) { vrchol[i].final_lichy=true; for(int j=0;jvrchol[i].vzdalenost_licha+cesta) { vrchol[pomocna.kam].odkud_suda=i; vrchol[pomocna.kam].vzdalenost_suda=vrchol[i].vzdalenost_licha+cesta; halda_suda_vloz(pomocna.kam); } } } } if(halda_suda_velikost>0) { printf("Odebiram vrchol ze sude\n"); int i=halda_suda_odeber(); if(!vrchol[i].final_sudy) { vrchol[i].final_sudy=true; for(int j=0;jvrchol[i].vzdalenost_suda+cesta) { vrchol[pomocna.kam].odkud_licha=i; vrchol[pomocna.kam].vzdalenost_licha=vrchol[i].vzdalenost_suda+cesta; halda_licha_vloz(pomocna.kam); } } } } } int i=cil; printf("Vzdalenost: %d\n%d",min(vrchol[cil].vzdalenost_licha,vrchol[cil].vzdalenost_suda),cil); bool licha=false; if(vrchol[i].vzdalenost_licha