#include #include int Vrcholu,Hran; struct Hrana { int VedeDo; // číslo vrcholu (jezírka), kam tahle hrana vede int Most; // 1, je-li to most, jinak 0 struct Hrana *DalsiHrana; // další hrana vedoucí z daného vrcholu struct Hrana *OpacnaHrana; // hrana opačného směru }; struct Hrana **Hrany; // pole pointerů na seznamu hran z daného vrcholu int *Navstiveno; // pro průchod do hloubky int HledejMosty(int Vrchol,int MinulyVrchol,int Hloubka) { // průchod do hloubky z daného vrcholu, který v dané komponentě souvislosti hledá mosty struct Hrana *AktualniHrana; int MinimalniHloubka; int HloubkaDaneVetve; Navstiveno[Vrchol] = Hloubka; MinimalniHloubka = Hloubka; for (AktualniHrana = Hrany[Vrchol];AktualniHrana != NULL;AktualniHrana = AktualniHrana->DalsiHrana) if (AktualniHrana->VedeDo != MinulyVrchol) { if (Navstiveno[AktualniHrana->VedeDo] == 0) { // nový vrchol, voláme se rekurzivně HloubkaDaneVetve = HledejMosty(AktualniHrana->VedeDo,Vrchol,Hloubka+1); if (HloubkaDaneVetve > Hloubka) { AktualniHrana->Most = 1; AktualniHrana->OpacnaHrana->Most = 1; }; } else { HloubkaDaneVetve = Navstiveno[AktualniHrana->VedeDo]; }; if (HloubkaDaneVetve < MinimalniHloubka) MinimalniHloubka = HloubkaDaneVetve; }; return MinimalniHloubka; }; int SpocitejMosty(int Vrchol) { struct Hrana *AktualniHrana; int Mostu; Navstiveno[Vrchol] = 0; Mostu = 0; for (AktualniHrana = Hrany[Vrchol];AktualniHrana != NULL;AktualniHrana = AktualniHrana->DalsiHrana) if (AktualniHrana->Most) Mostu++; else if (Navstiveno[AktualniHrana->VedeDo] != 0) Mostu+= SpocitejMosty(AktualniHrana->VedeDo); return Mostu; }; int main() { int i,Z,Do; int Listu,Stupen0; int VidiMostu; struct Hrana *NovaHrana1,*NovaHrana2; scanf("%d %d",&Vrcholu,&Hran); Hrany = malloc(Vrcholu * sizeof(struct Hrana *)); for (i = 0;i < Vrcholu;i++) Hrany[i] = NULL; for (i = 0;i < Hran;i++) { scanf("%d %d",&Z,&Do); Z--;Do--; // indexujeme 0..Vrcholu-1 NovaHrana1 = malloc(sizeof(struct Hrana)); NovaHrana2 = malloc(sizeof(struct Hrana)); NovaHrana1->OpacnaHrana = NovaHrana2; NovaHrana2->OpacnaHrana = NovaHrana1; NovaHrana1->VedeDo = Do; NovaHrana1->Most = 0; NovaHrana1->DalsiHrana = Hrany[Z]; Hrany[Z] = NovaHrana1; NovaHrana2->VedeDo = Z; NovaHrana2->Most = 0; NovaHrana2->DalsiHrana = Hrany[Do]; Hrany[Do] = NovaHrana2; }; Navstiveno = malloc(sizeof(int)*Vrcholu); for (i = 0;i < Vrcholu;i++) Navstiveno[i] = 0; for (i = 0;i < Vrcholu;i++) if (Navstiveno[i] == 0) HledejMosty(i,-1,1); Stupen0 = 0;Listu = 0; for (i = 0;i < Vrcholu;i++) if (Navstiveno[i] != 0) { VidiMostu = SpocitejMosty(i); if (VidiMostu == 0) Stupen0++; if (VidiMostu == 1) Listu++; }; printf("%d\n",((Stupen0 == 1) && (Listu == 0)) ? 0 : (Stupen0 + (Listu+1)/2)); return 0; };