#include #include struct vrchol_t { //Jak bohatá je to jeskyně? int poklad; //Už jsem to s něčím propojil? int spojeno; //V tomto postavíme dfu int dfu_otec; int dfu_vaha; }; struct hrana_t { //Indexy obou konců int vrcholy[2]; int delka; }; static int mensi_hrana(const void *_1, const void *_2) { return ((struct hrana_t *) _1)->delka - ((struct hrana_t *) _2)->delka; } static int dfu_find(struct vrchol_t vrcholy[], int v) { if(vrcholy[v].dfu_otec == v) return v; else { int result = dfu_find(vrcholy, vrcholy[v].dfu_otec); vrcholy[v].dfu_otec = result;//Zkomprimuj cestu return result; } } static void dfu_union(struct vrchol_t vrcholy[], int v1, int v2) { if(vrcholy[v1].dfu_vaha > vrcholy[v2].dfu_vaha) dfu_union(vrcholy, v2, v1);//Zapojovat spravnym smerem else { vrcholy[v1].dfu_otec = v2; vrcholy[v2].dfu_vaha += vrcholy[v1].dfu_vaha; } } int main(void) { //Nějaké to načtení int vrcholu, hran; scanf("%d%d", &vrcholu, &hran); struct vrchol_t vrcholy[vrcholu]; for(int i = 0; i < vrcholu; i++) { scanf("%d", &vrcholy[i].poklad); vrcholy[i].dfu_otec = i; vrcholy[i].dfu_vaha = 1; vrcholy[i].spojeno = 0; } struct hrana_t hrany[hran]; for(int i = 0; i < hran; i++) { scanf("%d%d%d", &hrany[i].vrcholy[0], &hrany[i].vrcholy[1], &hrany[i].delka); } //Hrany jsou potřeba setříděné qsort(hrany, hran, sizeof *hrany, mensi_hrana); //Bereme jednotlivé hrany a vybírame, jestli je chceme for(int i = 0; i < hran; i++) { //Nespoj dvě s pokladem, pokud to není speciální případ if(((vrcholy[hrany[i].vrcholy[0]].poklad && vrcholy[hrany[i].vrcholy[1]].poklad) && (vrcholu != 2)) || (vrcholy[hrany[i].vrcholy[0]].poklad && vrcholy[hrany[i].vrcholy[0]].spojeno) || (vrcholy[hrany[i].vrcholy[1]].poklad && vrcholy[hrany[i].vrcholy[1]].spojeno)) continue; int komponenty[] = { dfu_find(vrcholy, hrany[i].vrcholy[0]), dfu_find(vrcholy, hrany[i].vrcholy[1])}; if(komponenty[0] != komponenty[1]) { printf("%d %d %d\n", hrany[i].vrcholy[0], hrany[i].vrcholy[1], hrany[i].delka); dfu_union(vrcholy, komponenty[0], komponenty[1]); vrcholy[hrany[i].vrcholy[0]].spojeno = 1; vrcholy[hrany[i].vrcholy[1]].spojeno = 1; } } return 0; }